2014-01-08 6 views
2

Я пытаюсь найти ссылку с помощью regexp, которая появляется непосредственно перед textABCXYZ123 в строке ниже HTML.Поиск последнего вхождения href

lorem ispum...<strong><a href="http://www.site.com/link/123">FIRSTlink</a> </strong><br> 
1 points| Saved Jan 08, 2014 at 00:49 <span class=notes_box>ANOTHERLINK</span>. 
... more text........... more text........ 
... more text.......<strong><a href="http://www.site.com/link/123">other link</a> </strong><br> 
1 points| Saved Jan 08, 2014 at 00:49 <span class=notes_box>ANOTHERLINK</span>. 
... more text........... more text........ 
<strong><a href="http://www.IneedThis.com/link/123">somewhere to go</a> </strong><br> 
1 points| Saved Jan 08, 2014 at 00:49 <span class=notes_box>textABCXYZ123</span> 
... 
... more text..........<strong><a href="http://www.site.com/link/123">other link</a> </strong><br> 
1 points| Saved Jan 08, 2014 at 00:49 <span class=notes_box>ANOTHERLINK</span>. 
... more text........... more text........ 

Существует много ссылок, и мне нужно уловить ссылку, которая появляется непосредственно перед строкой textABCXYZ123. я пытался ниже регулярное выражение, но она возвращается меня первое звено вместо последнего:

$find_string = 'ABCXYZ123'; 
preg_match('#href="(.*)".*text'.$find_string.'#sU',$html,$match); 
// so final resutl is "http://www.site.com/link/123" which is first link 

Может кто-то наставит меня, как я могу захватить эту ссылку как раз перед моим строковых textABCXYZ123? P.S Я знаю про xpath и простой html dom, но я хотел бы совместить с regexp. Спасибо за любой вклад.

+0

Вы можете посмотреть на этой http://stackoverflow.com/questions/13618077/php-regex-to -match-the-last-origin-of-a-string для поиска последнего вхождения. – Braunson

ответ

2

Вы могли бы, возможно, попробовать регулярное выражение:

href="([^"]*)">(?=(?:(?!href).)*textABCXYZ123) 

как так?

$find_string = 'ABCXYZ123'; 
preg_match('~href="([^"]*)">(?=(?:(?!href).)*text'.$find_string.')~sU',$html,$match); 

regex101 demo


Первая часть href="([^"]*)"> и не должно быть слишком трудно понять. Он соответствует href=", а затем любое количество символов без кавычек, за которыми следуют кавычки и >.

(?=(?:(?!href).)*textABCXYZ123) первый положительный взгляд. (У положительного взгляда есть формат (?= ...)) Он будет следить за тем, что есть внутри, чтобы сказать, что есть совпадение.

Например, a(?=.*b) соответствует любому a, до тех пор, пока какие-либо символы, то а b где-то после a (также означает, что он соответствует a, пока есть b где-то после него).

Таким образом, href="([^"]*)"> будет соответствовать только в том случае, если есть (?:(?!href).)*textABCXYZ123 где-то впереди.

(?:(?!href).)* представляет собой модифицированный .*, так как отрицательный предпросмотр (формат (?! ...)) удостоверяется не href не соответствует. Можно сказать, что это противоположность положительного предпросмотра:

a(?!.*b) соответствует любому a, пока это не следует b.

+0

Огромное спасибо, точно, как я хотел. Не могли бы вы немного объяснить ваш образец. Я очень новичок в регулярном выражении, и это будет большой помощью для изучения. Еще раз спасибо. – user969068

+0

@ user969068 Добавлено несколько пояснений. Надеюсь, это не так сложно понять :) – Jerry

+0

Большое спасибо за ваши усилия. Очень полезно. Не могу поблагодарить ... С наилучшими пожеланиями – user969068

1
(?s)href=[^<]+</a>(?!.*(href).*(textABCXYZ123))(?=.*(textABCXYZ123)) 

Может попробовать это, дайте мне знать, если вы хотите эксплантации

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