Помощь с регулярным выражением - PullRequest
1 голос
/ 26 мая 2011

Мне нужно искать в постах WordPress посты, в которые включена галлерея с фотографиями, вставленными из медиатеки и не прикрепленными к постам (это часть WordPress, если вы ее не получили, это хорошо, это просто, чтобы объяснить, что я делаю:)

В любом случае, $ субъект выглядит так:

"some text or no text at all [gallery order="DESC" orderby="title" link="file" include="1089,1090,1091,1099,1105,1109,1113"]some text or no text at all"

Что мне нужно, так это список номеров из списка. Обратите внимание, что другие аргументы (например, порядок, ссылка и т. Д.) Не являются обязательными.

Я попробовал себя, но я просто не могу заставить его работать, вот что я сделал:

$pattern = '/^.\[gallery.include="(?)".\]$/';
$subject = '[gallery order="DESC" orderby="title" link="file" include="1089,1090,1091,1099,1105,1109,1113"]';
var_dump(preg_match($pattern, $subject, $matches));
print_r($matches);

Печать:

int(0) Array ( )

Помощь? Спасибо!

Ответы [ 3 ]

3 голосов
/ 26 мая 2011

Попробуйте с:

$pattern = '/^\[gallery.*?\sinclude="([^"]*)".*\]$/';

Один . в регулярном выражении соответствует только одному символу. .* соответствует любому количеству символов, жадно (то есть идет так далеко, как может). .*? делает то же самое, но не жадно (то есть останавливается, как только следующая часть более или менее совпадает).

Часть захвата - это [^"]*, который является инвертированным классом символов, что означает «все, кроме ", повторенного ноль или более раз».

И вам нужно экранировать [ и ], потому что они являются маркерами начала / конца для классов персонажей.

Если вы хотите иметь возможность иметь текст до или после [thing], удалите якоря (сначала ^, а затем $).

1 голос
/ 26 мая 2011

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

  • в вашем теге gallery нет ] символов.
  • естьНет include= в вашем gallery теге

Оба они верны как внутри цитируемых разделов, так и вне их.

Это регулярное выражение должно работать:

$pattern = '/\[gallery[^\]]* include="([\d,]*)"/';

$matches[1] теперь будет содержать разделенную запятыми строку.

$values = explode(',', $matches[1]);

$values теперь будет массивом чисел.

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

Попробуйте использовать:

$ pattern = '/^[gallery.?include="([^"])".*]$/';

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

Флаги ^ и $, содержащиеся соответственно в начале и конце вашей строки, означают, чтоэтот тег должен быть единственным в строке.

Использование:

/\[gallery.*?include="([^"]*?)".*?\]/

и он должен работать.

...