2014-01-04 2 views
3

Я пытаюсь найти регулярное выражение, соответствующее тегу гиперссылки HTML, который задал гипертекст. Например:Регулярное выражение соответствует гиперссылке определенного гипертекста

Мне нужно сопоставить любую гиперссылку, что ее гипертекст «Определенный текст».

Я только что нашел следующее выражение на Regular Expression Library, но это не решило проблему.

<a.+?href\=(?<link>.+?)(?=[>\s]).*?>(?<lnkText>.+?)</a> 

Надеюсь, решение, которое работает с PHP.

+0

вы хотите HREF = "бла-бла" или только «бла бла "? –

ответ

2
$regex = "/<a\s.*href.*>The defined text<\/a>/"; //corrected as per the comments 
$str = '<a href="blah blah" anyAttribute="" anyThingElse="anyValue">The defined text</a> 
    <a href="blah blah" anyAttribute="" anyThingElse="anyValue">The Not-defined text</a> 
'; 

preg_match($regex, $str, $matches); 

foreach($matches as $match) echo $match."<br/>"; 

Это будет соответствовать целая строка от

<a href 

к закрывающей метке.

</a> 

EDIT

ТЕХНИЧЕСКИ регулярное выражение может быть просто:

$regex = "/<a\s.*>The defined text<\/a>/" 

на самом деле это, вероятно, лучше!

Спасибо за уловку в комментариях!

+0

То, что я пытался ответить (+1). Я думаю, что более эффективно заменить 'a \ shref' на' a. * \ Shref' (href не ограничивается всегда первым). –

+0

Решение не найдено text

+0

Обновлен мой ответ, чтобы отразить эту возможность. Спасибо, ребята. –

1
$html='<a href="blah blah" anyAttribute="" anyThingElse="anyValue">The 
defined text</a>'; 
preg_match_all("/<a.+?href\=\"([^\"]*)\"[^>]*>The defined Text<\\/a>/",$html,$matches); 
foreach($matches[1] as $match) echo "Link found: " . $match; 

возвращает

Link найдено: бла

Если вы хотите, чтобы массив со всеми матчами:

$matches[1] 
+0

Ваш самый близкий из ответов.Возможно, вы захотите сделать несколько улучшений, а именно изменить первый '. +?' На '[^>] +?' И сделать группу захвата для «Определенного текста». Ваш метод получения матчей должен измениться, так как тогда у вас будут две группы захвата. – Jerry

+0

Я использовал ваше регулярное выражение с 'preg_replace' следующим образом:' echo preg_replace ("/ ] *> بسم <\\/a>/", ' 99 ', $ ayah [' Quran '] [' AyahText ']), но он не смог заменить тег html гиперссылки на свой гипертекст بسم с 99 из строки, определенной в $ ayah [' Quran '] [' AyahText ' ] – SaidbakR

0

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

((?=<a.+href).*(?<=</a>))[^</a] 

Для глобального поиска необходимо добавить флаг «г» и для отключения учета регистра флага «я»

Что касается PHP:

$html = '<a href="blah blah" anyAttribute="" anyThingElse="anyValue">The defined text</a> 
     <a href="blah blah" anyAttribute="" anyThingElse="anyValue">The defined text</a> 
     <a href="blah blah" anyAttribute="" anyThingElse="anyValue">The defined text</a> 
     <a href="blah blah" anyAttribute="" anyThingElse="anyValue">The defined text</a> 
     <a HREF="blah blah" anyAttribute="" anyThingElse="anyValue">The defined text</a> 
     <a anyAttribute="" anyThingElse="anyValue" href="blah blah">The defined text</a>'; 

preg_match('/((?=<a.+href).*(?<=</a>))[^</a]/gi', $html, $matches); 

var_dump($matches); 

Это решение для получения всех ссылок с атрибутом href, даже если несколько «а» помещены в одну строку. Пример:

<a HREF="blah blah" anyAttribute="" anyThingElse="anyValue">The defined text</a><a>asdasd</a> 
1

TRY это:

DEMO Прямой эфир: https://eval.in/85894

$p = '/<a.*? (href=".*?").*?>The defined text<\/a>/'; 
    $str = ' 
     <a href="blah blah" anyAttribute="" anyThingElse="anyValue">The defined text2</a> 
    <a href="blah blah" anyAttribute="" anyThingElse="anyValue">The defined text</a> 

    '; 
    preg_match_all($p,$str,$m); 
    print_r($m[1]); 

ВЫВОД:

Array 
(
    [0] => href="blah blah" 
) 
Смежные вопросы