Как сопоставить все в определенной последовательности в регулярном выражении

Я хочу иметь возможность выделять определенные части строки жирным шрифтом, используя регулярное выражение в 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);

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

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


person antriver    schedule 02.12.2011    source источник


Ответы (4)


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

$p = '{\*\*(.+?)\*\*}';
$r = '<bold>$1</bold>'
preg_replace($p, $r, $subject);
person rdlowrey    schedule 02.12.2011

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

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

person simshaun    schedule 02.12.2011

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

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

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

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

person Jonathan Rich    schedule 02.12.2011

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

person Jonny Cundall    schedule 02.12.2011