За последние 24 часа нас посетили 23545 программистов и 1664 робота. Сейчас ищут 847 программистов ...

Помогите написать регулярное выражение

Тема в разделе "PHP для новичков", создана пользователем BMWSauber, 10 ноя 2010.

  1. BMWSauber

    BMWSauber Активный пользователь

    С нами с:
    21 ноя 2009
    Сообщения:
    151
    Симпатии:
    0
    Помогите при помощи регулярного выражения создать массив ссылок http:// , www



    Код (Text):
    1.  
    2. $text = "dfsdfdfdfdfs dsffsdd http://site1.com fdsfdgfdgfdgfg
    3. dfsdfdfdfdfs dsffsdd www.site2.com fdsfdgfdgfdgfgdfsdfdfdfdfs dsffsdd http://site3.com fdsfdgfdgfdgfg
    4. dfsdfdfdfdfs dsffsdd http://site4.com fdsfdgfdgfdgfg";
     
  2. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    '/(http\:\/\/|www\.)[a-z0-9\-]+\.[a-z]{2,4}/iu'
    так может. работает, но я чтото очкую.
     
  3. BMWSauber

    BMWSauber Активный пользователь

    С нами с:
    21 ноя 2009
    Сообщения:
    151
    Симпатии:
    0
    результат тот же - т.е

    Код (Text):
    1. $text = preg_match('/(http\:\/\/|www\.)[a-z0-9\-]+\.[a-z]{2,4}/iu' , $text, $linkArr);
    2.  
    3. linkArr[0] = http://site1.com
    4. linkArr[1] = http://
    5. linlArr[2] = ""
    наверное запрос не правильный.
     
  4. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    preg_match_all + $matches
     
  5. BMWSauber

    BMWSauber Активный пользователь

    С нами с:
    21 ноя 2009
    Сообщения:
    151
    Симпатии:
    0
    Апельсин выложи пожалуйста полную строку ато нихрена не пашет.
     
  6. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    PHP:
    1. <?php
    2. $text = "dfsdfdfdfdfs dsffsdd [url=http://site1.com]http://site1.com[/url] fdsfdgfdgfdgfg
    3. dfsdfdfdfdfs dsffsdd [url=http://www.site2.com]www.site2.com[/url] fdsfdgfdgfdgfgdfsdfdfdfdfs dsffsdd [url=http://site3.com]http://site3.com[/url] fdsfdgfdgfdgfg
    4. dfsdfdfdfdfs dsffsdd [url=http://site4.com]http://site4.com[/url] fdsfdgfdgfdgfg";
    5.  
    6. preg_match_all('/(http\:\/\/|www\.)[a-z0-9\-]+\.[a-z]{2,4}/iu', $text, $matches);
    7.  
    8. echo '<pre>';
    9. print_r($matches);
    10. echo '</pre>';
     
  7. BMWSauber

    BMWSauber Активный пользователь

    С нами с:
    21 ноя 2009
    Сообщения:
    151
    Симпатии:
    0
    угу ужо разобрался СПАСИБО!
     
  8. BMWSauber

    BMWSauber Активный пользователь

    С нами с:
    21 ноя 2009
    Сообщения:
    151
    Симпатии:
    0
    кстати выражение кривоватое вон нормальное кому надо
    '(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)'
    '([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)'
     
  9. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    BMWSauber
    обоснуй чем оно "кривоватое" и чем вышеприведенное лучше, исходя из поставленной задачи в начале темы.
    иначе ололо только.
     
  10. BMWSauber

    BMWSauber Активный пользователь

    С нами с:
    21 ноя 2009
    Сообщения:
    151
    Симпатии:
    0
    ни кого обидеть не хотел, но при запросе к более сложным ссылкам оно обрезает половину строки.
    Другая просьба, помогите пожалуйста скомпоновать в одно регулярное выражение 3
    т.е http , www. и @

    Код (Text):
    1. preg_match_all('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)', $fr, $httpArr);
    2.   preg_match_all('(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)', $fr, $wwwArr);
    3.   preg_match_all('([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})', $fr, $mailArr);
    чтоб получался один массив "$matches" а не 3.
     
  11. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    что просил, то и получил. Пусть ктото другой теперь поможет с менее "кривоватым" решением.
     
  12. Johnatan

    Johnatan Активный пользователь

    С нами с:
    6 мар 2008
    Сообщения:
    508
    Симпатии:
    0
    Адрес:
    Испания
    Дело было ночью, делать было "вообще работы по горло, но так сильно хотелось отвлечься"... Вобщем только что наваял. Из того, что я проверял - хавает всё. Но, это, конечно мега нубский регэксп, так что строго не судите.
    PHP:
    1.  
    2. <?php
    3.                 '(?:(?:http|https|ftp){1}:\/\/)?(?:www\.|[a-z0-9\-_]+(?:\.|@))*(?:[a-z0-9][a-z0-9_\-]*\.)+(?:[a-z][a-z]*){1}(?:\:[0-9]{1,5})?(?:\/)?'. //  [url=https://www-2.vasya.rambler.info:88/]https://www-2.vasya.rambler.info:88/[/url]
    4.                 '(?:[a-z0-9][a-z0-9_\-]*\/)*'. // [url=https://www-2.vasya.rambler.info/broma/getto/kisk/]https://www-2.vasya.rambler.info/broma/getto/kisk/[/url]
    5.                 '(?:[a-z0-9][a-z0-9_\-%]*\.[a-z0-9]+)?'. // [url=https://www-2.vasya.rambler.info/broma/getto/kisk/superfile.ps2]https://www-2.vasya.rambler.info/broma/ ... erfile.ps2[/url]
    6.                 '(?:\?{1}(?:[a-z0-9][a-z0-9_\-]*)\=(?:[a-z0-9_\-%]+)?'. // [url=https://www-2.vasya.rambler.info/broma/getto/kisk/superfile.ps2?pros23=43Rew%20ewewf]https://www-2.vasya.rambler.info/broma/ ... ew%20ewewf[/url]
    7.                 '(?:&{1}(?:[a-z0-9][a-z0-9_\-]*)\=(?:[a-z0-9_\-%]+)?)*)?'. // [url=https://www-2.vasya.rambler.info/broma/getto/kisk/superfile.ps2?pros23=43Rew%20ewewf&efwewf=23f2ew]https://www-2.vasya.rambler.info/broma/ ... ewf=23f2ew[/url]
    8.                 ')#i', $in, $arr);
    9. ?>
    10.  
     
  13. BMWSauber

    BMWSauber Активный пользователь

    С нами с:
    21 ноя 2009
    Сообщения:
    151
    Симпатии:
    0
    уважаемый апельсин! я попросил на меня не обижаться! Если не верите мне на слово попробуйте сами!

    Весь код:

    Код (Text):
    1. <?
    2. $file  = $_GET['path'];
    3.  
    4.   getLinks($file); //использование функции не обязательно, приведено для демонстрации.
    5.  
    6. //код "выдергивает" ссылки сз любого файла, поэтому проверка на валидацию не используется
    7. //в случае необходимости проверки на целостность xml ниже приведен код xml парсера отлавливающий ошибки.
    8. //при помощи регулярных выражений ищу ссылки http и www, а также адреса эл почты.
    9. //код немного грамоздок изза использования 3 рег выражений.
    10. function getLinks ($file)
    11. {
    12. $fh = fopen($file, "r") or die("Can't open file!");
    13.   $fr = fread($fh, 20000000);
    14.     fclose($fh);
    15.  
    16.  preg_match_all('/(http\:\/\/|www\.)[a-z0-9\-]+\.[a-z]{2,4}/iu', $fr, $httpArr);
    17.   /*
    18.   preg_match_all('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)', $fr, $httpArr);
    19.   preg_match_all('(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)', $fr, $wwwArr);
    20.   preg_match_all('([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})', $fr, $mailArr);
    21.   */
    22.  
    23. echo "<br><b>Ссылки! </b>";  
    24.   echo "<br>-------------------------------------------";
    25.     echo "<br><i>http:</i><br>";
    26.   echo "-------------------------------------------";
    27.  
    28.  
    29.   for ($i=0; $i< count($httpArr[0]); $i++)
    30.   {
    31.     echo '<pre>';
    32.     echo "без форматирования<br>";
    33.     echo $httpArr[0][$i]."<br>";
    34.     echo '</pre>';
    35.  
    36.     //просто переводим в другую переменную для простоты чтения.
    37.     $explString = $httpArr[0][$i];
    38.  
    39.     //переводим строку адреса(ссылки) в масив в котором:
    40.     // $explArrDblSlash[0] есть - префикс "http://"
    41.     //а $explArrDblSlash[1] - остальной адрес
    42.    
    43.     $explArrDblSlash = explode ("//", $explString);
    44.    
    45.         //тестовая проверка
    46.         if (count($explArrDblSlash) >= 2)
    47.         {
    48.           //т.к. нам нужен только основной адрес, то все после / игнорируется
    49.           $explArrSlash = explode ("/", $explArrDblSlash[1]);
    50.          
    51.           //создаем полную строку адреса на домашнюю страницу $addr
    52.           $addr = $explArrDblSlash[0]."//".$explArrSlash[0];
    53.    
    54.      
    55.    
    56.           echo '<pre>';
    57.             echo "<br>ссылка на домашнюю страницу!<br>";
    58.           echo  '<a href="'.$addr.'">'.$addr.'</a>';
    59.         echo '</pre>';
    60.    
    61.         }
    62.   else {echo "ПРОВЕРКА ТЕСТ!!!!";}
    63.   echo "-------------------------------------------";
    64.    
    65.   }
    66.  
    67.  
    68. //то же самое только для www
    69. echo "<br><i>www</i><br>";
    70.  echo "-------------------------------------------";
    71.    
    72.   for ($i=0; $i< count($wwwArr[0]); $i++)
    73.   {
    74.     echo '<pre>';
    75.       echo "без форматирования<br>";
    76.       echo $wwwArr[0][$i]."<br>";
    77.     echo '</pre>';
    78.     //просто переводим в другую переменную для простоты чтения.
    79.     $explString = $wwwArr[0][$i];
    80.     //переводим строку адреса(ссылки) в масив в котором:
    81.     // $explArrDblSlash[0] есть - префикс "http://"
    82.     //а $explArrDblSlash[1] - остальной адрес
    83.    
    84.     $explArrDblSlash = explode ("www", $explString);
    85.    
    86.         //тестовая проверка
    87.         if (count($explArrDblSlash) >= 2)
    88.         {
    89.           //т.к. нам нужен только основной адрес то все после / игнорируется
    90.           $explArrSlash = explode ("/", $explArrDblSlash[1]);
    91.          
    92.           //создаем полную строку адреса на домашнюю страницу $addr
    93.           $addr = "www".$explArrSlash[0];
    94.    
    95.      
    96.    
    97.         echo '<pre>';
    98.             echo "<br>ссылка на домашнюю страницу!<br>";
    99.           echo  '<a href="'.$addr.'">'.$addr.'</a>';
    100.         echo '</pre>';
    101.    
    102.         }
    103.         else {echo "ПРОВЕРКА ТЕСТ!!!!";}
    104.         echo "-------------------------------------------";
    105.   }
    106.  
    107. //для e-mail все проще.
    108. echo "<br><i>mail</i><br>";
    109. echo "-------------------------------------------";
    110.  
    111.  
    112.   for ($i=0; $i< count($mailArr[0]); $i++)
    113.   {
    114.     echo '<pre>';
    115.     echo  $mailArr[0][$i]."<br>";
    116.     echo '</pre>';
    117.     echo "-------------------------------------------<br>";
    118.   }
    119. }
    120.  
    121.  
    122.  
    123.  
    124. //Парсер XML, на всякий случай
    125. echo "<br><br><b>Парсер! приведен для примера!</b><br>";
    126. function startElement($parser, $name, $attrs)
    127. {
    128.      
    129.     echo "Element: $name<br>";      // имя элемента
    130.        
    131.     foreach ($attrs as $attr => $value) {
    132.         // выводим имя атрибута и его значение
    133.         echo 'Attribute: '.$attr.' = '.$value.'<br>';
    134.     }
    135. }
    136.  
    137. function endElement($parser, $name)
    138. {
    139. }
    140.  
    141. $xml_parser = xml_parser_create();
    142.  
    143. xml_set_element_handler($xml_parser, "startElement", "endElement");
    144. xml_set_character_data_handler($xml_parser, "stringElement");
    145. xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
    146. if (!($fp = fopen($file, "r")))
    147. {
    148.     die("Can't open XML input");
    149. }
    150.  
    151. while ($data = fgets($fp))
    152. {
    153.     if (!xml_parse($xml_parser, $data, feof($fp)))
    154.     {
    155.         echo "<br>XML Error: ";
    156.         echo xml_error_string(xml_get_error_code($xml_parser));
    157.         echo " at line ".xml_get_current_line_number($xml_parser);
    158.         break;
    159.     }
    160. }
    161.  
    162. function stringElement($parser, $str)
    163. {
    164.  
    165.     if (strlen(trim($str)) > 0)
    166.     {
    167.    
    168.         echo 'String: '.$str.'<br>'; // выводим строку
    169.     }
    170. }
    171.  
    172.    
    173. xml_parser_free($xml_parser);
    174. //*** конец парсера
    175.  
    176. ?>


    файл XML!

    Код (Text):
    1.  
    2. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    3.  
    4. <response>
    5.   <books>
    6.     <book>
    7.       <title>
    8.         Building Reponsive Web Applications with AJAX and PHP www.ajax.ru
    9.       </title>
    10.       <isbn>
    11.         1-904811-82-5
    12.       </isbn>
    13.     </book>
    14.     <book>
    15.       <title>
    16.         Beginning PHP 5 and MySQL E-Commerce: From Novice to Professional problem_net@ukr.net
    17.       </title>
    18.       <isbn>
    19.         http://otvety.google.ru/otvety/thread?tid=1e0cf92fa021e9f4
    20.       </isbn>
    21.       <isbn>
    22.         www.otvety.google.ru/otvety   http://www.ukr.net/freemail
    23.       </isbn
    24.     </book>
    25.   </books>
    26. </response>
    index думаю прикрутите сами.


    результат при вашем рег выражении


    http://otvety.goog

    из

    http://otvety.google.ru/otvety/thread?t ... 2fa021e9f4


    при использовании строки приведеной мною выше все отображается нормально....

    еще раз прошу на меня не обижаться......

    лучше помогите с постом выше.
     
  14. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    что ты просил вначале этой темы?
    а вот что:
    ни в одной ссылке из примера нет строки с параметрами "?id=423424" и др. Потому и регулярку писал без учета этого. И в этом кривоватость не регулярного выражения, а кривое поставление задачи.
    Еще раз повторю - что просил вначале, то и получил. Я не должен продумывать все то, чего нет в примере.
     
  15. BMWSauber

    BMWSauber Активный пользователь

    С нами с:
    21 ноя 2009
    Сообщения:
    151
    Симпатии:
    0
    апельсин ок... )))) И все таки? )))))

    Johnatan - вроде редактированный пашет, буду завтра пробовать..... всем спасибо....