Php 用于文本解析的正则表达式存在问题(类似于textile)
我正在绞尽脑汁为下面的问题找出一个基于(regexp?)的解析器规则。我正在开发一个类似于textile(使用PHP)的文本标记解析器,但我不知道如何正确获取内联格式规则——我注意到,我发现的textile解析器无法格式化以下文本,因为我希望格式化它:Php 用于文本解析的正则表达式存在问题(类似于textile),php,regex,markup,textile,Php,Regex,Markup,Textile,我正在绞尽脑汁为下面的问题找出一个基于(regexp?)的解析器规则。我正在开发一个类似于textile(使用PHP)的文本标记解析器,但我不知道如何正确获取内联格式规则——我注意到,我发现的textile解析器无法格式化以下文本,因为我希望格式化它: -*deleted* -- text- and -more deleted text- 我想要的结果是: <del><strong>deleted</strong> -- text</del> a
-*deleted* -- text- and -more deleted text-
我想要的结果是:
<del><strong>deleted</strong> -- text</del> and <del>more deleted text</del>
预期结果:
<del>american-football player</del>
美国足球运动员
对于单个令牌,您可以简单地匹配:
-((?:[^-]|--)*)-
并替换为:
<del>$1</del>
您可以尝试以下方法:
'/-.*?[^-]-\b/'
结尾连字符必须位于单词边界处,前面有非连字符。我认为您应该先阅读此警告标志
也许您应该尝试用谷歌搜索php html库,
strong
标记很简单:
$string = preg_replace('~[*](.+?)[*]~', '<strong>$1</strong>', $string);
基于库的,对双破折号进行了一些修改
@
(?<!\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
@
(?为什么不首先使用Texture或Markdown?可以节省您的时间和麻烦。因为,我发现的实现显然在格式方面有限制。我也不喜欢几种格式规则--我需要混合使用Texture、Markdown和重新构造的文本--这是一种100%按我希望的方式运行的东西:-)我认为你需要使用一些具有读心能力的人工智能;)例如,你猜如何解析美国足球运动员?你需要用人类语言或在一组示例中制定一般、清晰、一致的解析规则,然后才尝试将它们翻译成regexp或其他任何形式。@rorick:我认为我的规则对于人类来说很容易制定:在句子开头和/或前面有空格时打开“-”。结束语“-”:句子结尾或后面的空格。然而,我不认为你需要特殊的人工智能:可能是这样的,我的规则很复杂,无法用正则表达式实现,但这是我问题的一部分。@harald-Rorick正确地指出,你的问题中缺少一些输入/输出示例,并展示了另一个edge案例。也就是说,我发布的最新版本是否适用于您?一个有效的评论是,您不能匹配嵌套的引号,或者在本例中,*
和-
,例如-aa*bb-cc-bb*aa-
。好的,对于本例,它是有效的,但是“-”在文本中仍然是有效字符。例如“-objective-c-”应该变成“objective-c”。@harald-好吧,你没有提到你需要它:)那将是str_replace(“,”--,$string)代码>。我想这就是黑客的问题:)@Kobi:噢!我都没注意到!您的解决方案更好,OP应该使用它。我有一个非常类似的,但无法让非捕获组工作。。。我今天没耐心了——已经醒了22个小时了P
'/-.*?[^-]-\b/'
$string = preg_replace('~[*](.+?)[*]~', '<strong>$1</strong>', $string);
$string = preg_replace('~-(.+?)-~', '<del>$1</del>', $string);
$string = str_replace('<del></del>', '--', $string);
@
(?<!\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
@(?<!\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>