正则表达式不起作用

时间:2012-07-11 08:36:47

标签: php regex

我在下面创建了一个正则表达式(使用php);必须与包含 termsa-z0-9._的给定字符串中的所有-匹配。

我的表达是:'~(?:\(|\s{0,},\s{0,})([a-z0-9._-]+)(?:\s{0,},\s{0,}|\))$~i'

我的目标字符串为:('word', word.2, a_word, another-word)。 结果中的预期terms为:word.2a_wordanother-word

我目前正在:another-word

我的目标

我正在从目标字符串中检测MySQL函数,这很好用。然后我想要那个目标字符串中的所有字段。这是我自己的ORM。

我想可能存在这样一种情况,即通过进一步的括号包含在这个表达式中。

2 个答案:

答案 0 :(得分:1)

使用正则表达式可能有点矫枉过正。在这种文本中,您可以删除括号并用逗号分解字符串。

答案 1 :(得分:1)

据我所知,你有一个以逗号分隔的术语列表,并希望只找到满足[a-z0-9._\-]+的术语。如果是这样,这应该是正确的(它至少会为您的示例返回正确的结果):

'~(?<=[,(])\\s*([a-z0-9._-]+)\\s*(?=[,)])~i'

主要问题是:

  • $最后,它将查询锚定到字符串
  • 的末尾
  • 当匹配所有你从前一场比赛结束时继续 - 这意味着如果你在一场比赛结束时匹配一个逗号/右括号,那么在下一场比赛开始时它不匹配。我用lookbehind((?<=...)和lookahead((?=...
  • 解决了这个问题
  • 您的反斜杠需要进行双重转义,因为解析字符串时第一个可能会被PHP剥离。

编辑:由于您在评论中说某些字词可能是包含逗号的字符串,因此您首先要通过此操作输入:

$input = preg_replace('~(\'([^\']+|(?<=\\\\)\')+\'|"([^"]+|(?<=\\\\)")+")~', '"STRING"', $input);

应该用“STRING”替换所有字符串,这样可以很好地匹配其他正则表达式。

相关问题