【问题标题】:Regular Expression works in 2 different web-evaluators but not in code正则表达式适用于 2 个不同的网络评估器,但不适用于代码
【发布时间】:2016-07-22 16:42:39
【问题描述】:

我目前在一个论坛上工作,想使用正则表达式来查找帖子中的表格并将它们转换为 BB-Code。我使用了一个网络评估器 (http://regexr.com) 并制定了一个正则表达式。

/^(\[table\]\s*)^((?:[^\|\r\n]+[\|\n])+)^(\[\/table\])$/m

用于检测表格的表格:

[table]
abc|def|gih
123|456|789
[/table]

但是当我通过 POST 和 <textarea> 将此文本传输到我的脚本时,在其上使用带有该模式的 preg_match_allvar_dump 结果我只会得到空数组。从逻辑上讲,替换功能也不起作用。

preg_match_all("/^(\[table\]\s*)^((?:[^\|\r\n]+[\|\n])+)^(\[\/table\])$/m", $_POST['test_string'], $tmp);
var_dump($tmp);

这个输出

array(4) { [0]=> array(0) { } [1]=> array(0) { } [2]=> array(0) { } [3]=> array(0) { } }

PS:我知道 regexr.com 是基于 JS 的,所以我尝试了一个基于 php 的 one,它也能完美运行。

编辑:添加代码示例

【问题讨论】:

  • 你能贴一些代码吗?
  • 据我所知,任何语言都需要转义字符串中的特殊字符。因此,首先尝试将“\”替换为“\\”。例如。 “\n”表示“换行”,“\\”表示单反斜杠。

标签: php regex preg-match-all


【解决方案1】:

您需要转义正则表达式的反斜杠以便在 PHP 字符串中使用:

$pattern = "/^(\\[table\\]\\s*)^((?:[^\\|\\r\\n]+[\\|\\n])+)^(\\[\\/table\\])$/m";

如果您想继续使用像 regexr 这样的网站,请改用regex101.com。编写正则表达式后,您可以单击Tools > code generator,它会显示可以在 PHP 中使用的代码。

【讨论】:

  • 看起来不错,但现在的问题是,这仅在我使用 php 脚本中的字符串直接定义变量时才有效。当我在通过 POST 和 textarea 传递给我的脚本的字符串上尝试它时,它不再起作用(可能由于某种原因而无法检测到换行符)。 array(4) { [0]=> string(40) "[table] abc|def|gih 123|456|789 [/table]" [1]=> string(8) "[table] " [2]=> string(24) "abc|def|gih 123|456|789 " [3]=> string(8) "[/table]" } string(40) "[table] abc|def|gih 123|456|789 [/table]" array(0) { } string(43) "[table] abc|def|gih 123|456|789 [/table]" 1 在脚本中,2 POST
  • 编辑:工作,但我首先必须在新行上分解输入,修剪它,然后用换行作为胶水将它内爆。
  • 好像你在输入中有尾随空格。您的正则表达式模式相对严格。我宁愿修复正则表达式,也不愿使用explode/trim/implode来解决它。也许尝试在最后一个 [\/table\] 之后添加一个 \s*
  • 我确实这样做了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多