PHP регулярное выражение ... получение первого экземпляра конечной скобки? - PullRequest
1 голос
/ 30 июня 2011

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

[% url = http://google.com]google ссылка [/ url%]

<a href='google.com' google link </a>

[% video = http://youtube.com? V = blah]

i will run the link through a automatic embed function 
developed in php..i just need to parse the link

[% PAGEBREAK%]

<hr>

[% img = wateva.jpg%]

<img src='wateva.jpg'>

Пока что я сделал URL, который работал отлично ... см. Ниже

$url_pattern = "/\[\s*%\s*(URL|url)\s*=\s*(.*)\](.*)\[\s*\/\s*(URL|url)\s*%\s*\]/i";
$description = preg_replace($url_pattern, "<a href='$2'>$3</a>", $description);

Но когда я попытался сделать изображение ... (см. Ниже)

$img_pattern ="/\[\s*%\s*(IMG|img)=(.*)\s*(%\s*\])/i";
$description = preg_replace($img_pattern, "<img src=\'$2\' style='width: 700px; height: auto; display:block;\'>", $description);

Он берет последний "%]" всего текста вместо ближайшего "%]" .. как мне сказать, чтобы он нашел самый близкий%]?

Вот мой тестовый текст:

* минимум 100 слов. Дайте описание вашего проекта в сочетании с изображениями, видео и / или ссылками ... просто не пишите роман! Используйте изображения, которые соответствуют вашему тексту, используя раздел изображений ниже. Значки в панели описания позволят вам добавить другие медиа, такие как ссылки и видео. Минимум 100 слов. Дайте описание вашего проекта в сочетании с изображениями, видео и / или ссылками ... просто не пишите роман! Используйте изображения, которые соответствуют вашему тексту, используя раздел изображений ниже. Значки в панели описания позволят вам добавить другие медиа, такие как ссылки и видео. Минимум 100 слов. Дайте описание вашего проекта в сочетании с изображениями, видео и / или ссылками ..

[% PAGEBREAK%]

[% IMG = uploads / 06-26-11 / Cog.gif%]

просто не пиши роман! Используйте изображения, которые соответствуют вашему тексту, используя раздел изображений ниже. Значки в панели описания позволят вам добавить другие медиа, такие как ссылки и видео. Минимум 100 слов. Дайте описание вашего проекта в сочетании с изображениями, видео и / или ссылками ... просто не пишите роман! Используйте изображения, которые соответствуют вашему тексту, используя раздел изображений ниже. Значки на панели описания позволят вам добавить другие медиафайлы, например ссылки и видео.

Это [% URL = http://google.com]link[/URL%]

Вот видео от gang gang dance

[% ВИДЕО = http://www.youtube.com/watch?v=lZMFwKVjV5s%]*

1 Ответ

2 голосов
/ 30 июня 2011

Проблема, скорее всего, .* в /\[\s*%\s*(IMG|img)=(.*)\s*(%\s*\])/i. * является жадным - он будет соответствовать концу документа, а затем возвращаться к last %], чтобы соответствовать ему. Обычно проблема будет скрыта, если вы не установите флаг /s, который заставляет . соответствовать символам новой строки (а также называется флагом Dot-All).
Простое решение состоит в том, чтобы использовать ленивый квантификатор, поэтому .*? ничего не соответствует по умолчанию, но затем использует машинную трассировку, чтобы соответствовать все большему и большему количеству символов, пока не найдет first %]:

/\[\s*%\s*(img)=(.*?)\s*(%\s*\])/i

Лучший вариант - определить, какой алфавит допустим в тегах img. Например, что-либо, кроме ] или новой строки:

/\[\s*%\s*(img)=([^\]\n\r]*)\s*(%\s*\])/i

Смотри также: Лень вместо жадности

Возможно, вы хотите исправить и другие шаблоны, они имеют ту же проблему.
Наконец, я бы посоветовал взглянуть на реализацию существующего парсера bbcode. Эти коды могут иметь вложенные конструкции (например, изображение в ссылке в блок-цитате), что затрудняет их правильный анализ.

...