2012-07-11 126 views
0

我在下面创建了一个正则表达式(使用php);其必须与包含的给定字符串中的全部terms相匹配a-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。

我想可能会出现这样一种情况,即在该表达式中包含进一步的括号。

+0

提示:'{0,}'与'*'相同。 – deceze 2012-07-11 08:39:01

+0

可以引用括号中的任何术语,或只引用第一个术语?可以有任意数量的引用条款吗?也许你可以向我们展示一些你的输入例子。 – Flimzy 2012-07-11 08:43:52

+1

另外,你是否需要处理嵌套的括号?所有括号是否总是正确平衡?引用字符串中是否可以有括号?引用字符串中是否有(引号或其他)引号?如果你想要一个正则表达式来处理这个问题,你需要解决这些问题。 – 2012-07-11 08:45:23

回答

1

从我可以告诉,你必须用逗号分隔的术语列表,并希望找到只满足[a-z0-9._\-]+的人。如果是的话,这应该是正确的(它返回你的榜样,至少正确的结果):

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

的主要问题是:

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

编辑:既然你在一个评论说,有些条款可能包含你首先要运行您的输入逗号通过这个字符串:

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

应全部更换琴弦''STRING'',对于匹配其他正则表达式可以很好地工作。

+0

感谢您的明确回复,很高兴能够比我更好地理解正则表达式。 – ash 2012-07-11 14:13:19

1

也许使用正则表达式是矫枉过正。在这种文本中,您可以删除括号并用逗号分隔字符串。

+1

正确。使用正则表达式'([^)] *)'来匹配字符串的整个括号部分,然后使用普通的旧字符串函数 - “爆炸”和朋友 - 来完成剩下的工作。 – 2012-07-11 08:48:37

+0

如果在引用字符串中出现逗号,该怎么办? – 2012-07-11 08:48:38

+0

噢,他应该知道什么可以出现在他的字符串中,而不是我。我的观点是如果可以的话,避免使用正则表达式。 – drupality 2012-07-11 08:49:53

相关问题