Проблема с несколькими совпадениями в одной строке в простом регулярном выражении - PullRequest
0 голосов
/ 21 мая 2011

У меня очень простой вопрос о регулярных выражениях. Я пытаюсь сопоставить и заменить URL-адреса, подобные этим:

http://mydomain.com/image/13/imagetitle.html

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

/mydomain.com(.*)image\/(\d+)\/(.*).html/

Этот шаблон в основном работает нормально, но он не работает, когда несколько вхождений появляются в одной строке. Так что это работает:

This is my own image: http://mydomain.com/image/13/imagetitle.html

При включении нескольких вхождений между строками это также работает:

This is my own image: http://mydomain.com/image/13/imagetitle.html
Yet I recommend this one as well: image: http://mydomain.com/image/15/imagetitle2.html

Оба вхождения совпадают и заменяются правильно. Тем не менее, он заменяет только первое совпадение, если в одной строке два вхождения:

This is my own image: http://mydomain.com/image/13/imagetitle.html, yet I recommend this one as well: image: http://mydomain.com/image/15/imagetitle2.html

Как я могу убедиться, что все совпадения заменены, независимо от новых строк?

Ответы [ 2 ]

2 голосов
/ 21 мая 2011

У меня тоже не было проблем. Но, судя по регулярному выражению, вашей проблемой, вероятно, будет жадность.

(.*) соответствует как можно больше. Он будет перехватывать два URL-адреса одновременно, если они находятся в одной строке. Как правило, вместо этого вы хотите использовать (.*?) или применить флаг неадекватности /U.

Но в вашем случае я бы посоветовал просто сделать матч более конкретным:

/mydomain.com(\S*)image\/(\d+)\/(\S*).html/

Здесь \S будет соответствовать только всему, что не является пробелом, потому что именно в этом месте URL должны быть разбиты. В качестве альтернативы вы можете использовать более специфический класс символов, например ([\w/.?&#%=-]*) вместо .*?.

0 голосов
/ 21 мая 2011

Ваш шаблон работает. Я проверил это по следующему коду:

$data = "This1 is my own image: http://mydomain.com/image/13/imagetitle.html, yet I recommend this one as well: image: http://mydomain.com/image/15/imagetitle2.html
This2 is my own image: http://mydomain.com/image/13/imagetitle.html, yet I recommend this one as well: image: http://mydomain.com/image/15/imagetitle2.html
This3 is my own image: http://mydomain.com/image/13/imagetitle.html, yet I recommend this one as well: image: http://mydomain.com/image/15/imagetitle2.html
This4 is my own image: http://mydomain.com/image/13/imagetitle.html, yet I recommend this one as well: image: http://mydomain.com/image/15/imagetitle2.html
";
echo preg_replace('/mydomain.com(.*)image\/(\d+)\/(.*).html/', 'replaced one', $data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...