【问题标题】:Regex not stripping periods正则表达式不剥离周期
【发布时间】:2012-04-20 15:06:01
【问题描述】:

为什么我的正则表达式没有去掉句点?最终结果应该只输出字母和数字字符,加上“-”,但我不断在输出中得到句点。我试过 trim($string, '.') 但没有用。请帮忙!

更新!我已经用正确的解决方案更新了代码。谢谢!

<?php
protected $trimCharacters = "/[^a-zA-Z0-9_-]/";
protected $validWords = "/[a-zA-Z0-9_-]+/";

private function cleanUpNoise($inputText){

  $this->inputText = preg_replace($this->trimCharacters, '', $this->inputText);
  $this->inputText = strtolower($this->inputText);
  $this->inputText = preg_match_all($this->validWords, $this->inputText, $matches);

  return $matches;
}
?>

【问题讨论】:

  • 会删除所有非字母数字或 - 字符暗示删除空白字符、冒号和 + 吗?因此,删除与您的 $splitPattern 匹配的所有内容将不那么有意义,因为您的下一步,您的 $trimCharacters 暗示 $splitPattern
  • 隐含是什么意思?
  • 你是对的,但即使删除了 $splitPattern,我的正则表达式仍然让 ." 通过。如果我在 regexpal.com 上测试它,它说它应该可以工作。
  • 对不起,我的英语出错了。必须是“牵连”。隐式意味着它是包含的。所以/[\s,\+]+/ 删除了这些类型的字符......而/[^\w-]/g 删除了所有非字母数字或'-'......所以[\s,\+]+ 删除的所有字符也将被/[^\w-]/g 删除。我认为如果你改变它们的顺序会很清楚......如果你首先在你的字符串上运行/[^\w-]/g,那么字符串中将不再有任何空格、冒号或加号,那么为什么要在字符串上运行[\s,\+]+?它已经无能为力了,因为 [^\w-] 暗示了它。

标签: php regex


【解决方案1】:

您的正则表达式仅在您第一次模式匹配时获取...尝试在您的模式中设置全局标志,例如

"/[\\s,\\+]+/g"

类似

'/[\s,\+]+/g'
'/[^\w-]/g'

将是您的表达式,您正在寻找...注意:您必须转义反斜杠...如果不是,php 将尝试解释 \s \+ \w...

像这样使用它

protected $splitPattern = '/[\\s,\\+]+/g';
protected $trimCharacters = '/[^\\w-]/g';

编辑:

哦……你不能把它简化成:

$this->inputText = preg_replace($this->splitPattern, '', $this->inputText);
$this->inputText = preg_replace($this->trimCharacters, '', $this->inputText);

【讨论】:

  • 这个全局修饰符在 php 中是这样识别的吗?
  • 哦,抱歉,您当然可以省略 g 标志,因为:“限制:每个主题字符串中每个模式的最大可能替换。默认为 -1(无限制)。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
相关资源
最近更新 更多