PHP Regex分组无法按预期工作

时间:2016-12-27 12:43:44

标签: php regex

所以,我会先发布一些代码:

$output = preg_replace([
  '/#(.*?)/i'
], [
  '<h1>$1</h1>'
], "#Input");

最终输出:

<h1></h1>
Input

在HTML OPT中,输入<h1>Input</h1>时我想要实现的输出为#Input,类似于Markdown,但这适用于基本的编辑系统。

我查看了Regex Debuggerhere),调试/堆栈跟踪是第一组没有任何内容,索引组是#

据我所知,唯一被采取并分组的事情(我被告知这一点)是( ... ),而left -> right来自$1 -> $x的组被标记为$.getScript("//" + @shortName + ".disqus.com/count.js")

对于过度使用的REGEX问题感到抱歉。

2 个答案:

答案 0 :(得分:3)

你有额外的&#34;?&#34;在你的正则表达式。

尝试:

if(x < a && x > b || x > a && x < b) {
count++;
System.out.println("Count value:" + count);
}

由于你没有匹配任何单词字符,因此不区分大小写不太有意义,所以你可以写:

$output = preg_replace([
  '/#(.*)/is'
], [
  '<h1>$1</h1>'
], "#Input");

当然,如果这是实际的解决方案,我会尝试在匹配定义上稍微缩小一些(取决于您的实际要求)。 E.g:

$output = preg_replace([
  '/#(.*)/s'
], [
  '<h1>$1</h1>'
], "#Input");

Here你有它的工作。 here最终版本。

答案 1 :(得分:1)

这里的问题是延迟点匹配模式在模式的末尾出现,并且因为它不必匹配任何文本,所以它不会。您的正则表达式与#匹配,并将空字符串捕获为第1组。

如果你想真正匹配某些东西,请使用,比如说

'/#(\S+)/'

匹配#并将1个或多个非空白字符捕获到组1中。

而不是\S+,您可能希望使用更受限制的模式(例如\w+用于1个或多个字符,[^<]+以匹配除{{1}以外的1个或多个字符}}或<匹配除空格和[^\s<]+之外的1个字符。