用于检测#number的php正则表达式

时间:2014-11-05 17:20:56

标签: php regex

我有以下正则表达式,我试图检测#x,x是一个数字。当比赛2周围没有任何东西时,我能够让它工作,但是如果有,那么它就会中断。有人可以帮我解决这个问题吗?

/(\G|\s+|^)#(\d+)((?=\s+)|(?=::)|$)/i

将适用于

This is a test #1234 end test

但这不适用于

This is a test #1234end test
This is a test#1234 end test
This is a test.#1234 end test
This is a test #1234. End test

任何人都知道需要改变什么来实现这个目标?

编辑,我试图在第3组中只允许使用字母数字,现在有::和空格。有没有办法将这些组合成1而不是检测字母或数字

2 个答案:

答案 0 :(得分:2)

使用/#\d+/i运行preg匹配可以获得您想要的内容。所以运行以下内容:

$items = [
    "This is a test #1234end test",
    "This is a test#1234 end test",
    "This is a test.#1234 end test",
    "This is a test #1234. End test"
];

foreach($items as $test){
    preg_match("/#\d+/i", $test, $matches);
    var_dump($matches);
}

你会得到这个结果:

array(1) {
  [0]=>
  string(5) "#1234"
}
array(1) {
  [0]=>
  string(5) "#1234"
}
array(1) {
  [0]=>
  string(5) "#1234"
}
array(1) {
  [0]=>
  string(5) "#1234"
}

如果您不希望结果中有#,那么您可以执行/#(\d+)/i

的子模式

然后会产生以下结果:

array(2) {
  [0]=>
  string(5) "#1234"
  [1]=>
  string(4) "1234"
}
array(2) {
  [0]=>
  string(5) "#1234"
  [1]=>
  string(4) "1234"
}
array(2) {
  [0]=>
  string(5) "#1234"
  [1]=>
  string(4) "1234"
}
array(2) {
  [0]=>
  string(5) "#1234"
  [1]=>
  string(4) "1234"
}

答案 1 :(得分:0)

(\G|\s+|^)#(\d+)((?=[^[:alnum:]])|$)

我想保留我拥有的三个小组,但我只改变了第三组。我删除了第3组中的::和\ S空格字符,只添加了一个简单的非字母数字检查,因为这也将包含这两个条件。

(\G|\s+|^)
#(\d+)
((?=[^[:alnum:]])|$)

[^[:alnum:]]