【问题标题】:preg_replace returning null, can't see an error with my RegExp [duplicate]preg_replace 返回 null,我的 RegExp 看不到错误 [重复]
【发布时间】:2015-06-14 14:14:31
【问题描述】:

我正在尝试从字符串中删除所有非数字、非单词字符(连字符除外)以创建 URI 存根。我有以下代码:

$urlPrefix = strtolower($this->urlPrefix.(substr($this->urlPrefix, -1) == '-' ? '' : '-'));
$urlPrefix = preg_replace('#\s+#', '-', $urlPrefix);
var_dump($urlPrefix);
$urlPrefix = preg_replace('#[^\d\w\s-]#g', '', $urlPrefix);
var_dump($urlPrefix); exit;

如果我设置$this->urlPrefix = "Test replace$%^*";,那么第一个var_dump($urlPrefix) 按预期输出test-replace$%^*-,但第二个转储输出NULL,但我看不出我的正则表达式有什么问题,有人可以帮我吗?为什么preg_replace 会出错?

【问题讨论】:

  • /g 不是 PCRE 的有效正则表达式标志。启用error_reporting
  • 我确实启用了error_reporting,因为它是一个开发服务器,所以它是强制的。不知道为什么它没有显示该错误。
  • 那么可能是 display_errors 不知何故被禁用了。作为最后的手段,你可以经常临时尝试set_error_handler("var_dump");
  • 如果返回null,请使用preg_last_error_msg() 获取正则表达式错误。

标签: php regex preg-replace


【解决方案1】:

g 不能与preg_replace 一起使用。在这里,这个sample code 工作正常:

<?php
   $urlPrefix = "test-replace$%^*-";
   $urlPrefix = strtolower($urlPrefix.(substr($urlPrefix, -1) == '-' ? '' : '-'));
   $urlPrefix = preg_replace('#\s+#', '-', $urlPrefix);
   var_dump($urlPrefix);
   $urlPrefix = preg_replace('#[^\d\w\s-]#', '', $urlPrefix);
   var_dump($urlPrefix);
   exit;
?>

输出:

string(17) "test-replace$%^*-"                                                                                                                                                                                                                         
string(13) "test-replace-"

【讨论】:

  • g cannot be used with preg_replace 声明是什么意思?默认情况下,PHP 会进行全局匹配,因此我们不需要显式放置 g 修饰符。它与preg_replace 无关。
  • @AvinashRaj:这正是我的意思。那里没有必要,并且会导致警告。
  • g cannot be used with preg_replace 让我觉得preg_replace 函数不允许g 修饰符,而其他函数如preg_matchpreg_match_all 将允许。
猜你喜欢
  • 2019-11-17
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多