Я изменяю PHP Markdown (парсер PHP языка разметки, который используется здесь в Stack Overflow), пытающийся реализовать пункты 1, 2 и 3, описанные Джеффом в этом сообщении блога . Я легко сделал последние два, но это очень сложно:
Фактически, в «нормальной» уценке реализация like_this_example будет отображаться как в этом примере. Это очень нежелательно; Я хочу, чтобы в качестве примера был только _пример.
Я посмотрел исходный код и обнаружил, что регулярное выражение используется для акцента:
var $em_relist = array( '' => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S|$)(?![.,:;]\s)', '*' => '(?<=\S|^)(?<!\*)\*(?!\*)', '_' => '(?<=\S|^)(?<!_)_(?!_)', ); var $strong_relist = array( '' => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S|$)(?![.,:;]\s)', '**' => '(?<=\S|^)(?<!\*)\*\*(?!\*)', '__' => '(?<=\S|^)(?<!_)__(?!_)', ); var $em_strong_relist = array( '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S|$)(?![.,:;]\s)', '***' => '(?<=\S|^)(?<!\*)\*\*\*(?!\*)', '___' => '(?<=\S|^)(?<!_)___(?!_)', );
Я попытался открыть его в Regex Buddy, но этого было недостаточно, и, проведя полчаса, я все еще не знаю, с чего начать. Какие-либо предложения?
Некоторые люди, столкнувшись с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них есть две проблемы.
Я смог захватить только отдельные слова с _enclosed_
через:
$input = 'test of _this_ vs stuff_like_this...and here is _anothermatch_ and_another_fake_string'; $pattern = '#(?<=\s|^)(?<!_)(_[^_]*_)(?!_)#is'; preg_match_all($pattern, $input, $matches); print_r($matches);
Я не уверен, как именно это будет вписываться в вышеприведенный код. Вам, вероятно, придется связать его с другими шаблонами ниже, чтобы учесть две и три ситуации:
$pattern = '#(?<=\s|^)(?<!_)(__[^_]*__)(?!_)#is'; $pattern = '#(?<=\s|^)(?<!_)(___[^_]*___)(?!_)#is';
Я тоже использую RegexBuddy. 🙂
Вы можете попробовать следующий код:
<?php $line1 = "like_this_example"; $line2 = "I want only _example_ to become example"; $pattern = '/\b_(?P<word>.*?)_\b/si'; if (preg_match($pattern, $line1, $matches)) { $result = $matches['word']; var_dump($result); } if (preg_match($pattern, $line2, $matches)) { $result = $matches['word']; var_dump($result); } ?>