【问题标题】:preg_match_all spaces with fullstops regexpreg_match_all 带有句号的空格正则表达式
【发布时间】:2017-01-27 11:22:07
【问题描述】:

我正在为我正在使用的一些方法编写一些单元测试,并且发现了一个奇怪的错误并想要一些正则表达式的建议。

做的时候:-

$needle = ' ';
$haystack = 'hello world. this is a unit test.';
$pattern = '/\b' . $needle . '\b/';
preg_match_all($pattern, $haystack, $matches, PREG_OFFSET_CAPTURE, $offset)

我期待的职位是

[5, 12, 17, 20, 22, 27]

就像我这样做一样,没有完全匹配的整个单词

while (($pos = strpos($haystack, $needle, $offset)) !== false) {
   $offset = $pos + 1;
   $positions[] = $pos;
}

但是 preg_match_all 没有找到第二次出现 (12) 之间的空格

. this 

这与 \b 边界标志有关吗?我该如何解决这个问题以确保它能够接收到其他问题?

谢谢

【问题讨论】:

  • 如果两边都需要字符字符,你怎么能期望\b \b 匹配.this 之间的空格?你需要什么词边界?什么是你的“词”?在任何逻辑世界中,空格都不能是单词。
  • 嗨 Wikto - 我不是!这就是我编写测试的原因,并想知道如何正确处理它。我的代码适用于文字,但我想更新它以处理它是否作为空格 =)

标签: php regex preg-match-all


【解决方案1】:

您必须将$pattern 更改为preg_match_all(),如下所示:-

<?php
$haystack = 'hello world. this is a unit test.';
while (($pos = strpos($haystack, ' ', $offset)) !== false) {
   $offset = $pos + 1;
   $positions[] = $pos;
}

echo "<pre/>";print_r($positions);

preg_match_all('/\s/', $haystack, $matches,PREG_OFFSET_CAPTURE);

echo "<pre/>";print_r($matches);

输出:- https://eval.in/725574

注意:- 你需要使用\s 来检查空格

您可以应用if-else 来根据$needle 更改$pattern:-

if($needle == ''){
   $pattern = '/\s/';
}else{
   $pattern = '/\b' . $needle . '\b/';
}

【讨论】:

  • Brill,谢谢 Anant - 完美。测试现在都是绿色的! =)
  • @OnIIcE 很高兴为您提供帮助。 :):)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2013-01-23
  • 1970-01-01
相关资源
最近更新 更多