2016-07-12 4 views
0

Я строю PHP-скрипт, который будет просеивать содержимое HTML запроса cURL и сопоставлять шаблоны для URL-адресов, чтобы я мог манипулировать добавлением тега GET для отслеживания исходящих ссылки.Regex Pattern (...) + не соответствует несколько раз

У меня есть шаблон регулярных выражений, который работает, но я не могу заставить его соответствовать более одного раза; он даже не найдет дубликат элемента, который он соответствует.

Это образец HTML, который в настоящее время только соответствующий первый якорь тег:

`<html><head> 
<title></title> 
</head> 
<body class="body class"> 
<div> 
    <a title="1hubwhrrstn" href="http://www.example.com?tag=9qgbc"></a> 
    <a name=""></a> 
    <a class="3hubwhbbsrstn" href="http://www.example.com?tag=uqgibc"></a> 
    <a class="4whbihbw4bsetrrstn" href="http://www.example.com?tag=9uq4i"></a> 
    <a href="http://www.example.com?tag=9uq4i" class="4whbihbstn"></a> 
</div></body> 
</html>` 

Узор Regex я использую: (<a.*href=".*".*><\/a>)+/im, и это только соответствие первый экземпляр привязки.

Кроме того, я не могу найти способ сказать, чтобы он соответствовал новой строке или всего на одной строке - она ​​дает мне одно совпадение, используя несколько тегов привязки, когда они находятся на одной строке, хотя я используя группу захвата, чтобы соответствовать шаблону одному тегу привязки. Таким образом, в данном случае, это найти один матч - даже для сдвоенных анкеров на одной и той же линии:

`<html><head> 
<title></title> 
</head> 
<body class="body class"> 
<div> 
    <a title="1tn" href="http://www.example.com"></a><a class="3htn" href="http://www.example.com"></a> 
    <a name=""></a> 
    <a class="4whbihbw4bsetrrstn" href="http://www.example.com?tag=9uq4i"></a> 
    <a href="http://www.example.com?tag=9uq4i" class="4whbihbstn"></a> 
</div></body> 
</html>` 

Я прошел через два часа лужения и двойной проверки флагов и кванторов, тестирование, как я иду на regex101. com и не может понять, где я делаю ошибку.

Любая помощь будет отличной. Спасибо!

+1

http://stackoverflow.com/questions/2204946/php-regular-expression-repeating-match-of-a-group , Связанный (JS): http://stackoverflow.com/questions/3537878/how-to-capture-an-arbitrary-number-of-groups-in-javascript-regexp –

+0

Работает, если вы добавите 'g' флаг. – Xufox

+0

Проблема не должна быть регулярным выражением, а скорее отсутствием модификатора '/ g' и, возможно, тем, как вы вызываете регулярное выражение. –

ответ

1

Ваше регулярное выражение (<a.*href=".*".*><\/a>)+/im жадно. Для того, чтобы сделать его менее жадными вы можете отклонить любую модель, которая имеет < внутри тега привязки:

(<a.*href=".*".*>[^<]*<\/a>)+/im 

Это адресует еще одну потенциальную проблему: якорные теги без содержимого внутри них необычны, и эта модель соответствует любому содержание в теге как если это не другой тег (конечно, наличие других тегов внутри href разрешено в html, поэтому это решение может быть недостаточно).

Кроме того, я не уверен, что вам нужен модификатор m в конце. Это для сопоставления шаблонов, которые охватывают несколько строк, и кажется, что ваши совпадающие шаблоны находятся на одной линии.

1

Я предполагаю, что вы используете preg_match()? Используйте preg_match_all() сделать глобальный матч р ех, так как вы не можете использовать модификатор g с preg_match()

Смежные вопросы