регулярные выражения

proc

Новичок
регулярные выражения

Ситуация:
Есть строка "...мама папа дядя тетя..."
Строка может меняться. Например: "папа мама дядя тетя" или "тетя дядя папа мама" и т.д.

Задача:
найти слова мама и дядя.

Вопрос:
Какое выражение нужно применить к строке, чтоб оно нашло эти слова в не зависимости от их местоположения?


Спасибо.
 

Vallar_ultra

Любитель выпить :)
(мама|дядя).*(мама|дядя)
Если надо найти ТОЛЬКО эти слова то ещё проще: (мама|дядя)
PHP:
$subject = "...тетя дядя папа мама...";
preg_match_all('/(мама|дядя)/', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];
var_dump($result);
2svetasmirnova:
Варриант с (мама|дядя).*(мама|дядя)
в случае $subject = "...тетя дядя папа мама...";
ничего не даст....
 

proc

Новичок
Автор оригинала: Vallar_ultra
Варриант с (мама|дядя).*(мама|дядя)
в случае $subject = "...тетя дядя папа мама...";
ничего не даст....
Если использывать preg_match то даст. Ну и добавить .* в начале и в конце.

И не понятно, зачем вы используете флаг PREG_PATTERN_ORDER, он ведь работает по умолчанию?
 

Vallar_ultra

Любитель выпить :)
2proc
И не понятно, зачем вы используете флаг PREG_PATTERN_ORDER, он ведь работает по умолчанию?
Привычка :)
Если использывать preg_match то даст. Ну и добавить .* в начале и в конце.
Это и ежу понятно, только как стоял вопрос: найти слова мама и дядя.

Ну вот и фсё :)
 

SelenIT

IT-лунатик :)
С прег_мэтч_оллом тоже все находится. Только ограничение $result = $result[0] (при PREG_PATTERN_ORDER) не позволяет этого увидеть.
 

proc

Новичок
Автор оригинала: Vallar_ultra

Это и ежу понятно, только как стоял вопрос: найти слова мама и дядя.

Ну вот и фсё :)
Чота я не уловил.
$string = "text text my mama is not a papa text text";
preg_match("/.*(mama|papa).*(mama|papa).*/",$string,res_arr);

теперь $res_arr [1] = mama
a $res_arr[2] = papap

Разве мы не нашли то что нужно. Проясните, если не трудно
 

Vallar_ultra

Любитель выпить :)
Да нет же, всё нашли, всё ОК, все довольны! :)
Просто если писать решение - то работающие в заданных условиях :) А (мама|дядя).*(мама|дядя) - это не оконченое решение задачи! оно должно было выглядеть .*(mama|papa).*(mama|papa).*

Может я конЭчно придираюсь маленько.... если кого напряг - сорри
 

SelenIT

IT-лунатик :)
Чота я совсем не уловил :)
PHP:
$string = "text text my mama is not a papa text text";
preg_match("/(mama|papa).*(mama|papa)/",$string,$res_arr);
print_r($res_arr);
Разве мы не нашли то что нужно, безо всяких .* в начале и конце? Так на кой они нужны?
 

Vallar_ultra

Любитель выпить :)
$res_arr[1] = "mama is not a papa" - там кроме mama и papa исчо кое-чаво есть... а надобно было только mama и papa

а если $string = "text text my mama is not a
papa text text"; - то
PHP:
preg_match("/(mama|papa).*(mama|papa)/",$string,$res_arr);
print_r($res_arr);
тогда уже нифига не жжот.... :)
 

SelenIT

IT-лунатик :)
Vallar_ultra
Не надо ля-ля. В первом случае $res_arr[1] == "mama", a $res_arr[2] == "papa". "Исчо кое-чаво есть" только в $res_arr[0].

А во втором случае .* в начале и в конце помогут как мертвому припарки. В отличие от модификатора s :)
 

Vallar_ultra

Любитель выпить :)
2SelenIT

Сорри, не ту цифирь нажал когда писал.... спать охота, вот по кнопкам и мажу.... :)

.* в конце не помогут, можно просто написать (mama|papa) - для решения изначально поставленой задачи хватит!

модификатор s - тоже варриант... :)
 

SelenIT

IT-лунатик :)
Без модификатора s в примере с многострочным текстом (mama|papa) найдет только "mama".

А если для решения изначально поставленой задачи хватит более простого выражения, то незачем "придираться" к более сложному в сторону еще большего его усложнения (причем, как оказалось, бессмысленного)...
 

Vallar_ultra

Любитель выпить :)
Виноват! (mama|papa) - действительно при многострочном тексте находит только mama....

2SelenIT:
если кого напряг - сорри!
 

KrK

Guest
У меня такая проблема:
Яндекс в результатах поиска выводит:
<A onClick="r(this,'web/pos=27')" href="http://www.apex-realty.ru/" target=_blank>
Я формирую регулярное выражение для отлова адреса сайта в таком виде: www.apex-realty.ru. Получается:
"#<A onClick=[\D]r[\D]this[\D][\D]web\/pos=[1-9]{1,4}[\D][\D][\D] href=href\/\/\:([a-z0-9\.\- ]{3,30})#i"
В чем здесь ошибка?
 

Vallar_ultra

Любитель выпить :)
Тебе надо всю строку получить?
<A ... href="http://www.apex-realty.ru/" ...> или только href="http://www.apex-realty.ru/"
 

KrK

Guest
мне нужно получить только www.apex-realty.ru. Без http//:
Есть функция:
preg_match("#<A onClick=[\D]r[\D]this[\D][\D]web\/pos=[1-9]{1,4}[\D][\D][\D] href=href\/\/\[a-z0-9\.\- ]{3,30})#i",$ans,$ret);

В массиве $ret должен быть список названий сайтов
 

Vallar_ultra

Любитель выпить :)
ну и в чём проблема?
PHP:
preg_match_all('/<A.*[^>]href="http:\\/\\/(.*?)\/.*[^"]".*[^>]>/s', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[1];
print_r($result);
Вот тебе и название сайта из строки <A onClick="r(this,'web/pos=27')" href="http://www.apex-realty.ru/" target=_blank>
 
Сверху