我正在修改PHP Markdown(在Stack Overflow上使用的标记语言的PHP解析器),试图实现Jeff在this blog post中描述的第1,2和3点。我很容易完成最后两个,但这个证明非常困难:
实际上,在“正常”降价实现中,like_this_example将呈现为 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打开它,但这还不够,经过半个小时的努力,我仍然不知道从哪里开始。有什么建议吗?
有些人在面对的时候 问题,想想“我知道,我会用 正则表达式。“现在他们有 两个问题。
答案 0 :(得分:3)
我也使用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);
}
?>
答案 1 :(得分:2)
我只能通过以下方式获取单个_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';