Регулярное выражение (preg_match) соответствует чему угодно - PullRequest
1 голос
/ 06 января 2012

Вот как далеко я дошел.Это работает:

$urls = $this->match_all('/<a href="(http:\/\/www.imdb.de\/title\/tt.*?)".*?>.*?<\/a>/ms',
            $content, 1);

Теперь я не хочу делать то же самое с другим сайтом.Но ссылка на сайт имеет другую структуру: http://www.example.org/ANYTHING

Я не знаю, что я делаю неправильно, но на этом другом сайте (example.org) он не работает.Вот что я попробовал

$urls = $this->match_all('/<a href="(http:\/\/www.example.org\/.*?)".*?>.*?<\/a>/ms',
    $content, 1);

Спасибо за вашу помощь.Stackoverflow такой крутой!

Ответы [ 3 ]

1 голос
/ 06 января 2012

НИЧЕГО обычно обозначается .*? (который вы уже используете в своем исходном регулярном выражении). Вы также можете использовать [^"]+ в качестве заполнителя в вашем случае.

0 голосов
/ 06 января 2012

Я думаю, что это должно помочь

/<a href="(http:\/\/www.example.org\/.*?)".*?>.*?<\/a>/ms
<a href="http://www.example.org/ANYTHING">text</a>

Результат:

Array
(
    [0] => <a href="http://www.example.org/ANYTHING">text</a>
    [1] => http://www.example.org/ANYTHING
)

РЕДАКТИРОВАТЬ: я всегда нахожу этот сайт очень полезным, когда я хочу попробовать preg_match - http://www.solmetra.com/scripts/regex/index.php

0 голосов
/ 06 января 2012

Похоже, вам нужно следующее регулярное выражение:

'/<a href="(http:\/\/example\.org\/.*?)".*?>.*?<\/a>/ms'

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

'#<a href="(http://example\.org/.*?)".*?>.*?</a>#ms'

Обратите внимание на экранирование . в доменном имени, поскольку вы намереваетесь соответствовать литералу ., а не любому символу.

...