2013-01-23 4 views
1

Что мне нужно, очень просто. Если ссылка или слово пустое или пустое, не совпадают.Regex не соответствует пустой ссылке html?

<a href="link">anything</a> - match 
<a href="">anything</a>  - not match 
<a href="link"></a>   - not match 
<a href=" ">anything</a> - not match 
<a href="link"> </a>  - not match 
<a href=" "> </a>   - not match 
<a href=""> </a>   - not match 
<a href=" "></a>   - not match 
<a href=""></a>    - not match 

Что я пробовал сначала;

<a href="(.*?)">(.*?)</a> 

и я знаю ^a означает НЕ a. Но только ^ недействителен. Итак, какой синтаксис означает NOT EMPTY?

Примечание: Я знаю, что в теге a могут быть другие атрибуты.

+4

Почему вы не используете правильный синтаксический анализатор HTML вместо регулярных выражений? –

+0

Вы можете проверить, является ли ссылка или слово пустым или пробельным, проверяя _presence_ символа без пробелов. Во всяком случае, рекомендуется обратиться к DOM для определения содержимого узла html. – MikeM

ответ

0

Попробуйте это:

<a href="[^"\s]+"[^>]*>[^<\s]+</a> 
+0

Это не позволит пропускать _any_ пробелы между тегами ' ...'. – speakr

+0

@speakr true, но ни один из тестовых примеров в вопросе не имеет пробелов :) Кстати, я мог бы это исправить, но я cbb – Bohemian

1

Что мне нужно, очень просто.

Да это, и то, что вам действительно нужно, XPath:

//a[normalize-space(@href) != ""] 
+2

Это будет соответствовать '', что на самом деле не должно совпадать. '// [normalize-space (@href)! =" "и normalize-space (text())! =" "]' должно работать. +1 для XPath. – speakr

+0

@speakr: о право. Кажется, что мне нужно, чтобы более внимательно прочитать – BeniBela

1

Если вы действительно хотите, чтобы решить эту проблему с регулярным выражением вы можете использовать это:

/<a href="[^\s"]+">[^<]*[^<\s][^<]*<\/a>/ 

Это соответствует все в атрибут href="...", который по крайней мере один длинный и не содержит пробелов.

Также он соответствует всем тегам <a>...</a>, который состоит из хотя бы одного символа без пробела.

Если вы хотите, чтобы URLы, содержащие пробелы это регулярное выражение работы:

/<a href="[^"]*[^\s"]+[^"]*">[^<]*[^<\s][^<]*<\/a>/ 

Однако, рассмотреть возможность использования синтаксического анализатора и языка запросов, как XPath вместо (как это было предложено here).

0

Вы можете использовать

/<a href="\s*\S[^"]*">\s*\S[^<]*<\/a>/ 

\s*\S[^<]*< средства не соответствуют пробельные ни одного или несколько раз, пока не следуют один не пробел, затем любой символ, который не < нет или больше раз, а затем <.

Конечно, это может произойти с ошибкой, если между тегами есть <.

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