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

herr_skin

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

добрый вечер. Я мало еще программировал в php, но надо написать скрипт который будет получать значения имени юзера.
<a href=/fyc/vdp.jsp?user_id=*переменная часть ссылки*>vasilij *текст который надо получить в масив*</a>
у меня не получается написать регулярное выражение для функции preg_match_all. Вся заковырка в переменной части ссылки.
мне надо только имена юзеров если в примере то это vasilij.
Помогите мне.
 

herr_skin

Новичок
пробывал для статичной

-~{}~ 01.12.05 20:15:

пробывал для статичного тега вроде не чего сложного:
preg_match_all ('#<p class="user">Name - ([^</>]+?)</p>#i', $file, $username);

но делаю для своего примера вот так:
preg_match_all ('<a href=/fyc/vdp.jsp?user_id[^>]*>([^</>]+?)</a>|U', $file, $username);

вот такая конструкция не работает.
 

Гравицапа

elbirret elcno
herr_skin
1. экранируй все служебные символы (какие подскажет ссылка,которую дал тебе SiMM
)
2. [^>]* -> ([^>]*) таким образом ты выделишь первый субпаттерн
соответственно второй субпаттерн ([^<\/>]+?) и даст то что тебе нужно
3. Если сидишь под виндами, то может оказать полезным использовании проги The Regex Coach
под никсы тоже есть аналоги
 

t3[0one]

Новичок
если я правельно понял задачу :
нужно взять данные между тегов <a href=/fyc/vdp.jsp?user_id...>взять все ктоме первого слова</a>

ради спортивного интереса эту задачу попробывал решить так .
PHP:
<?

$str ='<a href=/fyc/vdp.jsp?user_id=rty>vasilij *текст который надо получить в маси3*</a>
<a href=/fyc/vdp.jsp?user_id=*переменная часть ссылки*>vasilij *текст который надо получить в масив2*</a>
<a href=/fyc/vdp.jsp?user_id=*переменная часdfть ссылки*>vasilij я вообще хз <dfgdfgdsf dfgdf d>  </a>
';
preg_match_all('/<a href=\/fyc\/vdp\.jsp\?user_id=.+?>.[^ ]+(.+?)<\/a>/is',$str,$match);
print_r($match);
?>
для всех тегов "а"
preg_match_all('/<a.+?>.[^ ]+(.+?)<\/a>/is',$str,$match);



если я не прав поправте пожалуйста
 

herr_skin

Новичок
задача вырезать в массив ник. Я сделал так:
PHP:
<? 
 $file=file_get_contents('http://localhost');  
preg_match_all ('#<a href=/fyc/vdp.jsp\?car_id([^>]*)>([^</>]+?)</a>#i', $file, $user); 
 for ($i=0; $i< count($user[0]); $i++)    
{    
 $name = $user[2][$i];  
 echo $name;  
}  
?>
 

herr_skin

Новичок
t3[0one]
а можеш показать что не так, т.е. что надо сделать как советовал Гравицап? У меня в моем виде все работает и находит то что надо. Без экранирования служебных символов.
 

whirlwind

TDD infected, paranoid
herr_skin
Это совпадение, что твой вариант работает так как надо. Например, эта строка так же подходит под твой регэксп

<a href=/fyc/vdpxjsp?user_id

PHP:
$invstr="<a href=/fyc/vdpxjsp?car_id=123>boom tralala</a>";
$valstr="<a href=/fyc/vdp.jsp?car_id=123>boom tralala</a>";

$invre='#<a href=/fyc/vdp.jsp\?car_id([^>]*)>([^</>]+?)</a>#i';
$valre='#<a href=/fyc/vdp\.jsp\?car_id([^>]*)>([^</>]+?)</a>#i';

echo ( check_re($invre,$invstr) ? "" : "not ")."found\n";
echo ( check_re($invre,$valstr) ? "" : "not ")."found\n";
echo ( check_re($valre,$invstr) ? "" : "not ")."found\n";
echo ( check_re($valre,$valstr) ? "" : "not ")."found\n";

function check_re($re,$str){
	return preg_match($re,$str) ? true : false;  
}
 

herr_skin

Новичок
да понял свою ошибку, спасибо. Но вот по ходу дела возник еще вопрос, а если я имею большой кусок кода непример:
$file="
<table bgcolor="#FFFFFF" width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td width="10"><img width="10" height="1" src="http://img.phpclub.ru/images/space.gif" alt=""></td><td width="100%">
.......
это кусок исходинка этой страници ..... а заканчивается она так:
........
</td><td width="10"><img width="10" height="1" src="im/x.gif"></td></tr>

</table>
";
т.е на странице этот кусок кода повторяется n-e количество раз. Это таблица в которой выводится весь ответ юзера с html тегами и тд. Как мне получить все что находится от <table bgcolor="#FFFFFF" ..... до </table> в переменную $fileout ?
 

herr_skin

Новичок
только что то не выходит:
PHP:
preg_match_all ('#<table([^>]*)>([^</>]+?)</table>#i', $file, $out);
$output=$out[0][0];
print $output;
 

whirlwind

TDD infected, paranoid
Правильно, потому что внутри таблицы то же теги есть. Тут надо смотреть по конкретному контенту. Возможно удобнее убрать все что снаружи таблицы, потому что если проедположительно внутри этой таблицы потенциально находятся вложенные таблицы, то одной регуляркой врядли выйдет - придется рекурсивно по тэговым контейнерам пробегаться. Вообще самый простой вариант

/<table>.*?<\/table>/

попробуй, может подойдет
 

whirlwind

TDD infected, paranoid
[^*] - шо ето ? 8-0

Уберите немедленно.

-~{}~ 02.12.05 19:19:

Это правда смешно... и наверное интерпретируется как: класс символов, в который попадаю все символы, для которых не ограничено ограничение квантификатора. И это при том, что понятие квантификатора применимо только к последовательности символов.

Вы хоть немного представляете, как работают Ваши регулярки или наугад? Не пытайтесь засунуть в регэксп как можно больше непонятной фигни. Делайте регэкспы проще и короче: и работать быстрее будут и самому понятнее.
 
Сверху