【问题标题】:I need help modifying a regular expression for PHP markdown我需要帮助修改 PHP 降价的正则表达式
【发布时间】:2010-08-01 00:38:17
【问题描述】:

我正在修改PHP Markdown(在 Stack Overflow 上使用的标记语言的 PHP 解析器)试图实现 Jeff 在this blog post 中描述的第 1、2 和 3 点。最后两个我很容易完成,但事实证明这一个非常困难:

  1. 删除了对单词内的支持 强调like_this_example

事实上,在“正常”的 markdown 实现中,like_this_example 将呈现为 likethisexample。这是非常不可取的;我只希望 _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 中打开它,但还不够,在花了半个小时的工作后,我仍然不知道从哪里开始。有什么建议吗?

有些人在遇到 问题,想“我知道,我会用 正则表达式。”现在他们有了 两个问题。

【问题讨论】:

  • 这些正则表达式让我感到困惑,所以我不太确定,但我认为您可以使用\b(单词边界)来检查下划线是否位于单词的开头和结尾。例如,\bfoo\b 将匹配 "foo bar" 中的 foo,但不会匹配 "foobar" 或 "barfoo"。仅供参考(我很确定你不能按原样使用它)/\b_(.+?)_\b/ 在我测试过的输入上做得很好。
  • 嘿,这不是一个答案,但你们是专家.. 你能帮我解决这个 WMD 的初级问题吗stackoverflow.com/questions/3616788/…

标签: php regex markdown


【解决方案1】:

我也使用 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】:

    我只能通过以下方式获取单个 _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';
    

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 2012-11-30
      • 2023-03-19
      相关资源
      最近更新 更多