2013-08-30 2 views
2

Я пытаюсь получать все тег привязки из заданного HTML где длина содержимого составляет более 30 символов т.е. если у меня есть этот HTML со мнойPHP Regex условного содержания Досталось и ссылок из HTML-тега привязки

<td><a hreh="anything">Content is more then 30 chars........</a> 
<a hreh="anything">another link</a> 
</td> 

Я написал этот RegEx для этого preg_match_all("/<a href=\"(.*)\"[^>]*>([a-zA-Z0-9]{30,999})<\\/[a-zA-Z]+>/si", $match[0],$posts);

, где 30 устанавливает ограничение на минимум 30 символов для хранения тега, но, к сожалению, это не работает.

Любой, кто может указать, что я сделал неправильно.

Благодаря

Примечание: Я пытаюсь извлечение Попробуйте эту страницу URL, This Link

+0

'[a-zA-Z0-9]' это, как вы видите, будет соответствовать буквам и цифрам, и насколько я знаю, URL-адреса содержат немного больше, чем ': P' –

+0

Является ли содержание действительно просто буквами и цифрами , нет пробелов или знаков препинания? – Barmar

+0

@php_nub_qq Он не использует это для соответствия URL-адресу, это текст ссылки. – Barmar

ответ

2

Would что-то просто, как

<a.*?>.{30,}?</a> 

не хватает? В приведенном выше примере указаны якорные метки, содержание которых составляет 30 символов и более. Он не пытается проверить атрибут href или любые другие атрибуты ссылки. Его можно изменить, если они необходимы.

Это переводится в preg_match_all как (благодаря @php_nub_qq)

preg_match_all("#<a.*?>.{30,}?</a>#", $match[0],$posts); 

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

+0

На самом деле вы хотел бы, чтобы это было '. {30,}? ' –

+0

@php_nub_qq почему дополнительный'> '? – Kami

+0

Потому что в противном случае он не будет останавливаться при первом возникновении '' –

0

это:

preg_match_all("/<a href=\"(.*)\"[^>]*>([a-z\d\s]{30,})<\\/[a-z]+>/si", $match[0],$posts); 

Поскольку у вас есть i не чувствительны к регистру модификатора, вам не нужны оба a-z и A-Z в ваших классах. И если вы просто устанавливаете минимальную длину содержимого, вам не нужно указывать максимум 999; {30,} означает 30 или более.

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