Я ищу регулярное выражение в 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>
), но он должен работать.