2013-04-11 4 views
0

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

Учитывая строку: [URL видео: HTTP: \ ddf.sd.com ASD: fgfggh] Тогда какой-то текст здесь идет затем снова [видео URL: HTTP: \ ddf.sd.com ASD: fgfggh] и некоторые после этого текст больше.

Обязательно O/P: Затем текст затем снова появляется и еще один текст, следующий за этим.

Язык: PHP

Что я пробовал:

$text='[video url:http:\\ddf.sd.com asd:fgfggh] Then some text goes here then again [video url:http:\\ddf.sd.com asd:fgfggh] and some more text following this.'; 
$op = reg_replace('/\[video(.*)\]/','',$text); 
echo $op 

о/р, что я получаю:

и еще какой-нибудь текст после этого.

ответ

1

Проблема в том, что ваш рисунок жадный, .* соответствует всем, что он может. Вы должны изменить матч

\[video[^\]]++] 

т.е. открывающей скобки следует любое количество элементов, которые не закрывающая скобка следуют одной закрывающей скобки.

Поэтому код будет выглядеть

$op = reg_replace('/\[video[^\]]++]/','',$text); 

Этот шаблон также притяжательные (++), который позволит значительно сократить откат в регулярных выражений и ускорить процесс.

+0

Спасибо @bmorris В квадратных скобках могут быть квадратные скобки промежуточный текст, но если за открывающей скобкой следует слово ** видео **, то все последующие за ним до закрытия **] ** должны быть удалены –

+0

Изменен шаблон. –

+0

Исправьте меня, если я ошибаюсь в понимании рисунка: (1) \ [video: Это обозначает узор, начинающийся с ** [видео ** (2) [^ \]]: Это означает что-либо, кроме * *] ** (3) ++]: За этим следует **] **? Если да, то что означает ++?Хотя вы сказали, что это сокращение назад, но я все еще смущен. –

2

Я изменил рисунок на немного:

$text='[video url:http:\\ddf.sd.com asd:fgfggh] Then some text goes here then again [video url:http:\\ddf.sd.com asd:fgfggh] and some more text following this.'; 
$op = reg_replace('/\[video.*?\]/','',$text); 
echo $op; 
+0

Спасибо @Yazmat Я новичок в регулярном выражении, может, пожалуйста, объяснить изменение, которое вы сделали в шаблоне? –

+1

ok Что я сделал - это удалить круглые скобки, так как они вам не нужны (вы ничего не фиксируете), и добавьте '?' После '*', чтобы квантификатор '*' стал неровным (ленивым) – Oussama

+0

lazy meens что квантификатор остановится в первом совпадении, который он найдет для следующего символа, в отличие от жадного, который продолжается до последнего – Oussama

1

, не предполагающие квадратные скобки в URLs, вы могли бы использовать

'/\[video[^\]]*\]/' 

Ваш оригинальный регулярное выражение не работает, потому что .* будет взахлеб соответствовать всем символов до финала ].

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