Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于文本解析的正则表达式存在问题(类似于textile)_Php_Regex_Markup_Textile - Fatal编程技术网

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

我正在绞尽脑汁为下面的问题找出一个基于(regexp?)的解析器规则。我正在开发一个类似于textile(使用PHP)的文本标记解析器,但我不知道如何正确获取内联格式规则——我注意到,我发现的textile解析器无法格式化以下文本,因为我希望格式化它:

-*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>