如何使用条件字符执行正则表达式?
例如,我有以下表达式:
preg_replace(/\$[0-9]{1,10}|[0-9]{1,10}\$/, '', $content);
这取代了9000美元和9000美元。 我可以简化那个表达吗?如果$字符位于数字的开头或末尾,它仍将取代价格?
答案 0 :(得分:0)
如果数字与$
符号之间有可选空格:
preg_replace(/\$\s*[0-9]{1,10}\b|\b[0-9]{1,10}\s*\$/, '', $content);
答案 1 :(得分:0)
您使用的模式已经非常简单,很难进一步简化。但是,如果你的评论建议,你必须添加更多的模式替代品,你可以这样做:
(\$)?\d{1,10}(?(1)|\$)
这样,添加更多替代方案很容易,因为不需要为每个替代方案添加\$<your pattern>|<your pattern>\$
。
这是它的工作原理:
(\$)? # capture a dollar sign in group 1, if possible
\d{1,10} # here comes your pattern, e.g. matching 1 to 10 digits
(?(1)|\$) # finally, a conditional statement:
# if group 1 captured something (a dollar sign in this case), match nothing.
# otherwise, match a dollar sign.
添加替代品很简单:
(\$)?
(?: # don't forget to enclose the alternatives in braces
\d{1,10} # alternative 1
|
[\s+]\d{1,10} # alternative 2
|
# alternative 3 here, etc...
)
(?(1)|\$)
然而,很少需要这样的东西。只有在替代方案完全不同的情况下,才需要替代方案。您的模式捕获美元符号$
的事实表明该模式应该与数字匹配 - 并且所有数字看起来几乎相同。它们可能是也可能不是负数(也可能不是-
),它们可能是也可能不是浮点数,它们可能是也可能不是数字和美元符号之间的空格,但它仍然可能(和合理的)制作一个捕获所有这些的正则表达式模式,没有使用任何替代方案:
(\$)?\s?[+-]?\d+(?:\.\d+)?(?(1)|\s?\$)
这种模式很容易维护 - 例如如果您觉得需要支持数千个分隔符,则不必在多个位置更新模式,如果您使用替代方案的情况就是如此。