2013-05-28 3 views
1

Я пытаюсь совместить слово contact в содержании/тексте тегов html. Я могу получить весь текст между тегами:Regex текст между тегами не найден

http://rubular.com/r/IkhG2nhmnS

с:

(?<=\"\>)(.*?)(?=\<\/) 

Но я хочу, чтобы искать только слова contact, он не работает:

http://rubular.com/r/We44nHisLf

с:

(?<=\"\>)(contact*?)(?=\<\/) 

Может ли кто-нибудь указать, как мне соответствовать слово, которое я хочу, в тексте/содержании тегов html. В вышеописанном случае я хочу найти/Сопрягайте слово contact

Спасибо за вашу помощь

+6

Вы не хотите использовать r egex для соответствия тэгам HTML. В самом деле. Вы этого не сделаете. – Tomalak

+1

[Один не просто анализирует HTML с регулярным выражением] (http://rubular.com/r/vZSfz5IyU8). – HamZa

+0

@Tomalak Я регулярно использую регулярные выражения для соответствия тэгам HTML. И я действительно хочу это сделать. –

ответ

2

Вы, вероятно, хотите что-то вроде this:

(?<=\"\>).*(contact)?(?=\<\/) 

Ваше текущее регулярное выражение:

(?<=\"\>)(contact*?)(?=\<\/) 

только матч:

<a href="contact">contact</a> 

Но также ...

<a href="contact">contactttt</a> 

Или даже ...

<a href="contact">contac</a> 

Поскольку * применяет только к t предшествующих.

.* в моем регулярном выражении делает учет любых символов до contact.

1

Если вы действительно должны использовать регулярные выражения для разбора HTML-теги, а затем

(?<=>)[^<]*(contact)[^<]*(?=<\/) 

Вот a test. Ваше совпадение относится к группе 1.

Вместо этого обратите внимание на DOM functions, для правильного анализа структурированных документов.

3

Описание

Это регулярное выражение будет тянуть весь текст внутри HREF в теге привязки.

<a\b[^>]*?\bhref=(['"])([^'"]*)\1[^>]*?>

enter image description here

Группы

группы 0 будет иметь всю найденную строку из <a в >

  1. получает открытую цитату для HREF раздела. Это используется в дальнейшем в регулярном выражении, как \1, чтобы соответствовать близко котировке
  2. получает содержание HREF значения

Отказ

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

PHP Пример кода:

<?php 
$sourcestring="your source string"; 
preg_match_all('/<a\b[^>]*?\bhref=([\'"])([^\'"]*)\1[^>]*?>/im',$sourcestring,$matches); 
echo "<pre>".print_r($matches,true); 
?> 

$matches Array: 
(
    [0] => Array 
     (
      [0] => <a href="contact"> 
     ) 

    [1] => Array 
     (
      [0] => " 
     ) 

    [2] => Array 
     (
      [0] => contact 
     ) 

) 

Резюме

  • <a матч <a
  • \b граница между словом полукокса (\ ш) и то, что не слово, символ
  • [^>]*? любой символ кроме: '>' (0 или mor е раз (соответствует наименьшее количество возможных))
  • \b границу между словом полукокса (\ ш) и то, что не слово, символ
  • href= матч href=
  • ( группа и захват \ 1 :
  • ['"] любой символ: ''», '"'
  • ) конец \ 1
  • ( группа и захватить в \ 2:
  • [^'"]* любой символ, кроме ''», '"' (0 или несколько раз (соответствие наибольшее количество возможно))
  • ) конец \ 2
  • \1 что было совпадающая с помощью захвата \ 1
  • [^>]*? любой символ, кроме: '>' (0 или более раз (соответствует наименьшее количество возможных))
  • > матч >
  • ) конец группировки
+1

Предполагая, что вы не нарисовали вышеприведенную диаграмму вручную, как вы ее создали? –

+2

@ Вердан: Crayola! хахаха. Но серьезно я использую debuggex.com. Хотя он не поддерживает lookbehinds, он по-прежнему удобен для понимания потока выражения. Существует также regexper.com. Они тоже очень хорошо работают, но это не в режиме реального времени, когда вы печатаете. –

+1

Очень круто! Спасибо! –

2

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

(?<=\"\>)[^<]*(contact) 

где

[^<]* 

означает: (символ, который не является <), столько раз, сколько возможно

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