Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 正则表达式匹配模式,除非转义_Php_Regex - Fatal编程技术网

Php 正则表达式匹配模式,除非转义

Php 正则表达式匹配模式,除非转义,php,regex,Php,Regex,我尝试了几种风格的PHPmarkdown转换器,用于将*XYZ*转换为标记,并将**ABC**转换为标记。他们对我需要的东西做得有点太多了,比如添加段落标签等等 注意,我只使用了两个标记 我写了一个RegExp,它可以正常工作,但我需要转义保留字符,以防用户需要这些字符中的文字字符,就像我在文章中所做的那样 这就是我到目前为止所做的: preg_replace("/(?<!\\\)\*\*([^\*\*]*)(?<!\\\)\*\*/", "<strong>$1</

我尝试了几种风格的
PHP
markdown转换器,用于将*XYZ*转换为标记,并将**ABC**转换为标记。他们对我需要的东西做得有点太多了,比如添加段落标签等等

注意,我只使用了两个标记

我写了一个RegExp,它可以正常工作,但我需要转义保留字符,以防用户需要这些字符中的文字字符,就像我在文章中所做的那样

这就是我到目前为止所做的:

preg_replace("/(?<!\\\)\*\*([^\*\*]*)(?<!\\\)\*\*/", "<strong>$1</strong>", $line);
但它输出

My name is <em></em>Earle<em></em>*
我叫厄尔*

我的正则表达式出了什么问题,您能解释一下修复程序是什么吗,以便将来的人们知道

您需要匹配转义实体,您不能使用lookarounds

\*\*([^*\\]*(?:\\.[^\\*]*)*)\*\*

说明

  • \*\*
    -2个前导星号
  • ([^*\\]*(?:\\.^\\*]*)*)
    -第1组匹配
    • [^*\]*
      -除
      *
      \
      之外的零个或多个字符
    • (?:\\.[^\\*]*)*
      -零个或多个。。。
      • \\.
        -任何转义序列
      • [^\\*]*
        -除
        *
        \
        之外的零个或多个字符
  • \*\*
    -2个尾随的星号
正则表达式基于展开循环原则,应该足够有效地处理任何文本


此外,您可以使用
/s
修饰符甚至支持转义换行。

不可能将
<1
更改为
Earle
。您没有为我们显示一些代码。
\*\*([^*\\]*(?:\\.[^\\*]*)*)\*\*