2

我正在努力为以下问题找出一个基于(正则表达式?)的解析器规则。我正在开发一个类似于 Textile 的文本标记解析器(使用 PHP),但我不知道如何正确获取内联格式规则 - 我注意到,我发现的纺织品解析器无法格式化以下文本因为我想让它格式化:

-*deleted* -- text- and -more deleted text-

我想要的结果是:

<del><strong>deleted</strong> -- text</del> and <del>more deleted text</del>

想要的是:

<del><strong>deleted</strong> </del>- text- and <del>more deleted text</del>

任何想法都非常感谢!非常感谢!

更新

我想我应该提到,'-' 应该仍然是一个有效字符(连字符):) - 例如以下应该是可能的:

-american-football player-

预期结果:

<del>american-football player</del>
4

5 回答 5

2

基于RedCloth库的解析器描述,对双破折号进行了一些修改。

@
  (?<!\S)               # Start of string, or after space or newline
  -                     # Opening dash
  (                     # Capture group 1
    (?:                 #   : (see note 1)
      [^-\s]+           #   :
      [-\s]+            #   :
    )*?                 #   :
    [^-\s]+?            #   :
  )                     # End
  -                     # Closing dash
  (?![^\s!"\#$%&',\-./:;=?\\^`|~[\]()<])  # (see note 2)
@x
  • 注意 1:这应该懒惰地匹配下一个破折号,同时消耗任何非单破折号,以及被空格包围的单破折号。
  • 注 2:后跟空格、标点符号、换行符或字符串结尾。

或压缩:

@(?<!\S)-((?:[^-\s]+[-\s]+)*?[^-\s]+?)-(?![^\s!"#$%&',\-./:;=?\\^`|~[\]()<])@

几个例子:

$regex = '@(?<!\S)-((?:[^-\s]+[-\s]+)*?[^-\s]+?)-(?![^\s!"#$%&\',\-./:;=?\\\^`|~[\]()<])@';
$replacement = '<del>\1</del>';

preg_replace($regex, $replacement, '-*deleted* -- text- and -more deleted text-'), "\n";
preg_replace($regex, $replacement, '-*deleted*--text- and -more deleted text-'), "\n";
preg_replace($regex, $replacement, '-american-football player-'), "\n";

将输出:

<del>*deleted* -- text</del> and <del>more deleted text</del>
<del>*deleted*</del>-text- and <del>more deleted text</del>
<del>american-football player</del>

在第二个示例中,它将仅匹配-*deleted*-,因为 . 之前没有空格---text-将不匹配,因为首字母-前面没有空格。

于 2010-07-14T16:44:59.253 回答
1

strong标签很简单:

$string = preg_replace('~[*](.+?)[*]~', '<strong>$1</strong>',  $string);

为其他人工作。


del标签的无耻黑客攻击:

$string = preg_replace('~-(.+?)-~', '<del>$1</del>', $string);
$string = str_replace('<del></del>', '--', $string);
于 2010-07-14T07:53:52.367 回答
1

对于单个令牌,您可以简单地匹配:

-((?:[^-]|--)*)-

并替换为:

<del>$1</del>

同样对于\*((?:[^*]|\*{2,})*)\*<strong>$1</strong>

正则表达式非常简单:-两端都是文字。在中间,在捕获组中,我们允许任何不是连字符或连续两个连字符的内容。

要在单词中也允许单个破折号,如objective-c,这可以通过接受由两个字母数字字母包围的破折号来工作:

-((?:[^-]|--|\b-\b)*)-
于 2010-07-14T07:28:55.737 回答
0

我认为您应该先阅读此警告标志 您无法使用正则表达式解析 [X]HTML

也许您应该尝试使用谷歌搜索 php html 库

于 2010-07-14T07:51:33.930 回答
0

您可以尝试以下方法:

'/-.*?[^-]-\b/'

结尾连字符必须在单词边界处,并且前面有一些不是连字符的东西。

于 2010-07-14T07:29:25.010 回答