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

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

Я использую три примера:

**The quick brown fox jumps over the lazy dog.**

The **quick** brown fox **jumps over** the lazy dog.

**The quick* brown fox jumps over the lazy dog**.

Я пробовал:

$string = preg_replace('/\*\*(.+)\*\*/' , "<b>$1</b>" , $string);

Который терпит неудачу на втором, потому что дает:

The <b>quick** brown fox **jumps over</b> the lazy dog.

Он должен был остановиться после быстрого и снова соответствовать при прыжках.

Я также попытался:

$string = preg_replace('/\*\*([^*]+)\*\*/' , "<b>$1</b>" , $string);

, который работает на втором, но не работает на третьем, совсем ничего не сопоставляя.

Что я действительно хочу, так это:

$string = preg_replace('/\*\*([^*{2}]+)\*\*/' , "<b>$1</b>" , $string);

Но я знаю, что этознать правильно.Я думаю, что я должен как-то использовать негативную перспективу, но я не знаю как.

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 03 декабря 2011

Модификатор + в вашем шаблоне должен быть неуклюжим (см.? После +) ... в противном случае он сожрет все, что может, до последнего появления ** в строке субъекта.

$p = '{\*\*(.+?)\*\*}';
$r = '<bold>$1</bold>'
preg_replace($p, $r, $subject);
1 голос
/ 03 декабря 2011
$string = preg_replace('/\*\*(.+?)\*\*/' , "<b>$1</b>" , $string);

?делает захват ленивым, то есть он пытается сопоставить наименьший ограниченный набор двойных звездочек.

Для получения дополнительной информации см. здесь:

http://www.regular -expressions.info / reference.HTML

1 голос
/ 03 декабря 2011

Попробуйте \*\*(.+?)\*\*

Вам нужно сделать часть «соответствовать любому символу» нежадной, иначе она будет идти, пока не найдет последнее вхождение **.

0 голосов
/ 03 декабря 2011

Вы, возможно, уже знаете это, но php markdown уже имеет эту функцию вместе с целым рядом других простых средств форматирования.

...