Intereting Posts
Добавление продукта в корзину с пользовательской информацией и ценой Что произойдет, когда location.href будет изменен до завершения запроса ajax? Режим обслуживания обходного режима Laravel 4 для маршрута Как фильтровать ассоциативный массив по значениям и разбивать на две переменные? DomPDF {PAGE_NUM} не на первой странице PHP отображает символы \ r \ n при отражении в Textarea Как я могу выполнить пакет doObjectExist () в Amazon S3? Как добавить класс в каждый n-й элемент в php-контуре (wordpress) Невозможно сбросить запрос, чтобы показать сообщение ramdom после первого цикла WordPress PHP DOMPDF html to PDF конвертер проблема с выпуском шрифта в версии 6.0.1 Что делает <? php echo ("<pre>"); … echo ("</ pre>"); ?> означает? Дата истечения срока действия PHP Охват кода при отсутствии проверки защищенных / приватных методов с помощью PHPUnit Преобразование php-массива в строку csv Встроенные языки скриптов для PHP?

Regex PHP, сопоставить все ссылки с определенным текстом

Я ищу регулярное выражение в PHP, которое будет соответствовать якорю с определенным текстом на нем. Например, я хотел бы получить привязки с текстом mylink как:

<a href="blabla" ... >mylink</a> 

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

 <a href="blabla" ... >mylink</a> <a href="blabla" ... >blabla mylink</a> <a href="blabla" ... >mylink bla bla</a> <a href="blabla" ... >bla bla mylink bla bla</a> 

но не этот:

 <a href="blabla" ... >bla bla bla bla</a> 

Потому что этот не содержит слова mylink.

Также это не должно совпадать: "mylink is string" потому что это не привязка.

Любая идея?

Thanx Granit

Вместо этого попробуйте парсер:

 require_once "simple_html_dom.php"; $data = 'Hi, I am looking for a regular expression in PHP which would match the anchor with a specific text on it. Eg I would like to get anchors with text mylink like: <a href="blabla" ... >mylink</a> So it should match all anchors but only if they contain specific text So it should match t hese string: <a href="blabla" ... >mylink</a> <a href="blabla" ... >blabla mylink</a> <a href="blabla" ... >mylink bla bla</a> <a href="blabla" ... >bla bla mylink bla bla</a> but not this one: <a href="blabla" ... >bla bla bla bla</a> Because this one does not contain word mylink. Also this one should not match: "mylink is string" because it is not an anchor. Anybody any Idea? Thanx Granit'; $html = str_get_html($data); foreach($html->find('a') as $element) { if(strpos($element->innertext, 'mylink') === false) { echo 'Ignored: ' . $element->innertext . "\n"; } else { echo 'Matched: ' . $element->innertext . "\n"; } } 

который производит выход:

 Matched: mylink Matched: mylink Matched: blabla mylink Matched: mylink bla bla Matched: bla bla mylink bla bla Ignored: bla bla bla bla 

Загрузить simple_html_dom.php с: http://simplehtmldom.sourceforge.net/

Это должно работать (создайте строку регулярных выражений и вставьте любую строку, которая вам нужна, вместо «mylink»)

 <\s*a\s+[^>]*>[^<>]*mylink[^<>]*<\s*\/a\s*> 

Но это не рекомендуется. Вместо этого следует использовать парсер HTML и обработать тег. Regex на самом деле не лучший инструмент для этого. (Вышеупомянутое регулярное выражение не будет работать, если у вас есть ссылки, содержащие «>», хотя это может быть редко)

Я предполагаю, что php не требует каких-либо специальных escape-символов, если вы просто используете соответствующий обертку.

Протестировано на regexpal.com

Несколько примечаний ::
\ s * – Чтобы сопоставить необязательные пробелы
\ s + – Чтобы соответствовать по крайней мере одному пробелу / вкладке и любым дополнительным необязательным пробелам
[^>] – Соответствует любому символу, кроме '>'
[^ <>] – Соответствует любому символу, кроме '<' или '>'

UPDATE: избежал «/» для соответствия php с помощью m / regex /

 if (preg_match('%<\s*a\s+href="blabla"[^>]*>(.*mylink.*)<\s*/a>%', $text, $regs)) { $result = $regs[1]; } else { $result = ""; } 

$regs[0] будет содержать полное соответствие $regs[1] будет содержать бит внутри тега

 /<a[^>]*>([^<]*mylink[^<]*)<\/a>/ 

он немного упрощен, так как он будет разбит, если теги находятся внутри ссылки ( <a href="/xyz">xyz <i>mylink</i> aaa</a> ), но он должен работать.