Мне нужна помощь в изменении регулярного выражения для разметки PHP - PullRequest
2 голосов
/ 01 августа 2010

Я изменяю PHP Markdown (PHP-парсер языка разметки, который используется здесь при переполнении стека), пытаясь реализовать пункты 1, 2 и 3, описанные Джеффом в этого сообщения . Я легко сделал последние два, но этот оказывается очень трудным:

  1. Удалена поддержка внутрисловного слова. выделение как_данный_экземпляр

Фактически, в «нормальной» реализации уценки like_this_example будет отображаться как этот пример. Это очень нежелательно; Я хочу, чтобы только _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 , но этого оказалось недостаточно, и, потратив на это полчаса работы, я все еще не знаю, с чего начать. Есть предложения?

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

Ответы [ 2 ]

3 голосов
/ 01 августа 2010

Я тоже использую 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);
}

?>
2 голосов
/ 01 августа 2010

Мне удалось набрать только отдельные _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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...