Регулярные выражения: Поиск в строке текста между определенными словами.

0139

Guest
Регулярные выражения: Поиск в строке текста между определенными словами.

Вопрос:
PHP:
// Есть переменная:
$text = 'http://www.yandex.ru/yandsearch?text=%C1%EE%EB%E5%E7%ED%E8+%F0%E0%F1%F2%E5%ED%E8%E9+-+%CC%F3%F7%ED%E8%F1%F2%E0%FF+%F0%EE%F1%E0&q=92837342338&a=26763&b=236283628736';

//Задача: Получить в итоге:
$text1='%C1%EE%EB%E5%E7%ED%E8+%F0%E0%F1%F2%E5%ED%E8%E9+-+%CC%F3%F7%ED%E8%F1%F2%E0%FF+%F0%EE%F1%E0';
// Т.е. все что находится между 'text=' и '&'
Нужно наверное использовать регулярные выражения.
 

fisher

накатила суть
в новички, скорее...
PHP:
if(preg_match("/text=(.*?)&/",$text,$matches))
    $text1 = $matches[1];
 

tony2001

TeaM PHPClub
делает, почему же.
разборка урля, в результате он может получить именно то, что надо.
 

si

Administrator
делает, почему же.
разборка урля, в результате он может получить именно то, что надо.
Может ты все-таки вопрос почитаешь ? :)
parse_url делает то что ему совсем не нужно, поcле parse_url надо будет все рабно разбирать query_string скорее всего при помощи того же regext
 

tony2001

TeaM PHPClub
совсем необязательно использовать в этом случае регэксп.
далее - [m]parse_str[/m]
it's easy =)
 

si

Administrator
Не хотите по хорошему, ладно будем по плохому :)

PHP:
if (!preg_match($r,$str,$result))
    $result = 'NOT FOUND';
else
    $result = urldecode($result[1]);
Итераций 5000
0.10758292675018 sec

PHP:
  $result = parse_url($str);
Итераций 5000
18.777366042137 sec

parse_str - у меня вообще не работает, т.е ничего не извлекает из стороки, это похоже на буг (РНР4.2.1)
 

tony2001

TeaM PHPClub
ладно, сдаюсь.
не хотите делать удобно - делайте регэкспами (эту фразу можно цитировать =)

З.Ы. я уже начал праздновать....
 

0139

Guest
PHP:
/text=([^&]*)/
Если я вместо & подставляю %26, то ничего не находится.

Отчего и почему?
 

si

Administrator
А может стоит сначала почитать про regexp прежде чем что-то куда-то подставлять ? Представьте себе, что будет если таким способом будут писать програмы например для самолетов ? Вы захотите на таком самолете лететь ?
 

0139

Guest
Осмелюсь заметить, что при таком написании программ, самолеты не смогут летать. Так что при всем моем желании...

Так вот, при использовании /text%3D([^&]*)/ все очень даже работает. Т.е. /text%3D([^&]*)/ мне оставляет весь текст, который находится после text%3D. Но если я поставлю /text%3D([^%26]*)/ то результат нулевой.

PS: в исходнике у меня не знак & а именно %26.
 

Amigo

Guest
Ну ХЗ, конечно, насчет версии, но вот такая шняга работает нормально ( проверил на 401 - 412 ).
Работает как nix так win32.

<pre>
<?
$text = "http://www.yandex.ru/yandsearch?text=%C1%EE%EB%E5%E7%ED%E8+%F0%E0%F1%F2%E5%ED%E8%E9+-+%CC%F3%F7%ED%E8%F1%F2%E0%FF+%F0%EE%F1%E0&q=92837342338&a=26763&b=236283628736";
$str = parse_url($text);
parse_str($str["query"]);
echo $text ."<br>"; // эта переменная котрая стоит в запросе ?text="ля-ля-ля" , а не так в которую ты загнал "весь" запрос.
// echo $q;
// echo любой переменной которая есть в твоем запросе

?>
</pre>
 

0139

Guest
http://www.yandex.ru/yandpage?q=1245483590&p=3&ag=h&qs=text%3D%25CF%25D7%25CF%25DD%26tb%3D1

После обработки этой вот строки preg_match'ем:
preg_match("/qs=text%3D([^%26]*)/",$referer_array[$i],$matches)
получаем пустой результат. Если в preg_match %26 поменять на & то получим: %25CF%25D7%25CF%25DD%26tb%3D1

А мне-то надо было получить: %25CF%25D7%25CF%25DD

PS: RTFM, RTFM, и раз RTFM ( помоему Вы пропустили слово 'еще', нет? )
 

Amigo

Guest
да не парь ты мозги. я ж тебе написал готовое решение.
 
Сверху