2013-09-09 3 views
0

Я пытаюсь прочитать файл HTML и захватить все теги привязки, которые соответствуют определенному шаблону URL, чтобы отображать эти ссылки на другой странице. Образец выглядит так:Соответствующий шаблон URL с PHP

https://docs.google.com/file/d/aBunchOfLettersAndNumbers/edit?usp=drive_web 

Я отвратительный с RegEx. Я пробовал кучу вещей и прочитал кучу ответов здесь, в Stack Overflow, но я не нахожусь в правильном синтаксисе.

Вот что я сейчас:

preg_match ('/<a href="https:\/\/docs.google.com\/file\/d\/(.*)<\/a>/', $file, $matches) 

Когда я проверить это на HTML страницу с двумя тегами соответствия якорей, первый результат включает в себя первый и второй матч, и все между ними, в то время как второй результат включает в себя часть первого матча, часть второго матча и все между ними.

Хотя я был бы рад захватить соответствующие теги привязки вместе с внутренним HTML, я был бы еще счастливее, если бы мог создать многомерный массив с атрибутом HREF каждого соответствующего тега привязки, а также соответствующий внутренний HTML-код (поэтому я могу самостоятельно форматировать ссылки, не используя еще больше RegEx, чтобы избавиться от нежелательных атрибутов). Могу ли я использовать preg_match_all для этого? Как это будет выглядеть?

Я даже на правильном пути здесь, или я должен использовать запросы DOM и XPath, чтобы найти этот материал?

Спасибо.

+1

Вы должны полностью использовать DOM для этого. – Jon

+0

Regexes - это не волшебная палочка, которую вы можете волновать при каждой проблеме, которая связана со строками. Анализ HTML с регулярными выражениями приводит только к душевной боли и боли. –

ответ

0

Заменить (.*) с (.*?) - использовать ленивые квантификации:

preg_match('/<a href="https:\/\/docs.google.com\/file\/d\/(.*?)<\/a>/', $file, $matches); 
0

Дэйва,

DOM-бы лучше. Но здесь работает Regex.

$url = 'href="https://docs.google.com/file/d/aBunchOfLettersAndNumbers/edit?usp=drive_web"'; 

preg_match ('/href="https:\/\/docs.google.com\/file\/d\/(.*?)"/', $url, $matches); 

Результаты:

array (size=2) 
    0 => string 'href="https://docs.google.com/file/d/aBunchOfLettersAndNumbers/edit?usp=drive_web"' (length=82) 
    1 => string 'aBunchOfLettersAndNumbers/edit?usp=drive_web' (length=44) 

Вы можете можете HTML-теги, но самое главное, в вашем вопросе, ваш код в preg_match линии не содержит окончание> открывающего тега, который выбросил он должен был иметь (?) вместо (.). Добавлен? говорит ему искать любые персонажи неизвестного количества. (. *) означает любого персонажа, которого я считаю.

+0

OK, поэтому если DOM является предпочтительным способом сделать это, я бы загрузил HTML-страницу в DOMDocument, а затем пропустил все теги привязки с запросом xpath, который ищет текстовую строку, которая соответствует URL-адресам, которые я ищу. ? Ссылки, которые я ищу, не будут присутствовать во многих случаях. Будет ли решение DOM работать в этом случае? – Dave

0

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

/<a.*?href="(https:\/\/docs\.google\.com\/file\/d\/.*?)".*?>(.*?)<\/a>/ 

который даст вам URL из href и innerHTML.

ломается

<a.*?href=" не соответствуют отверстию a тега и любым charachters вплоть до href="

(https:\/\/docs\.google\.com\/file\/d\/.*?)" матчей (и захватывает) до конца href (т.е.до "

.*?> спичек всех символов до конца a тега >

(.*?)<\/a> Матчей (улавливает) в innerHTML до закрытия a тега (т.е. </a>).

1

О, боже, я не могу поверить, что каждый ответ здесь использует разделители «/». Если в вашем шаблоне есть косые черты, используйте что-то еще для удобства чтения.

Вот лучший ответ (возможно, вам нужно настроить, если ваши якоря могут иметь отличные HREF дополнительные атрибуты):

$hrefPattern = "(?P<href>https://docs\.google\.com/file/d/[a-z0-9]+/edit\?usp=drive_web)"; 
$innerPattern = "(?P<inner>.*?)"; 
$anchorPattern = "<a href=\"$hrefPattern\">$innerPattern</a>"; 
preg_match_all("@[email protected]", $file, $matches); 

Это даст вам что-то вроде:

[ 
    0 => ['<a href="https://docs.google.com/file/d/foo/edit?usp=drive_web"><span>More foo</span></a>'], 
    "href" => ["https://docs.google.com/file/d/foo/edit?usp=drive_web"], 
    "inner" => ["<span>More foo</span>"] 
] 

и абсолютно, вы должны использовать DOM для этого.

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