我的正则表达并不酷

时间:2012-03-04 13:06:29

标签: php regex

我当前的作品几乎完美无缺,但它会错过任何其他数字后面的字符 - 或/ 原始字符串类似于:

#!012 , #!02/09#!011 #!04-072 

我现在的作品就像:  $viewedResult = preg_replace('/#!([0-9A-Z]{1,4})/', '<a href="updateMooring.php?Number2=${1}&id='. $id .'">${1}</a>', $viewedResult);
这会给我一些类似的东西:

<a href="updateMooring.php?Number2=04&amp;id=db335b">04</a>-072<br />

但我希望Number2位中的“-072”如:

<a href="updateMooring.php?Number2=04-072&amp;id=db335b">04-072</a>

它也可以包含/ 072s:

<a href="updateMooring.php?Number2=04/072&amp;id=db335b">04/072</a>


有任何想法吗?请记住,有一个#!在数字前面!

4 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

preg_replace('~#!([0-9A-Z][0-9A-Z/-]{0,5})~', '<a href="updateMooring.php?Number2=${1}&id='. $id .'">${1}</a>', $viewedResult);

答案 1 :(得分:1)

我会将正则表达式分成两部分,因为我认为你想匹配像\d{1..4}[-/]?\d{1..4}这样的东西,其中第一和第二组数字总共为4.这可能更好只是寻找(\d+[-/]/d+)如果总位数大小正确,请在之后进行检查,例如在结果中查找(\d+)的所有匹配项,并以编程方式检查它们的长度。

一般情况下,我会密切关注允许输入究竟是什么,以及如果输入不匹配,您会得到什么(错误)。将事情拆分会更容易显示正确的错误信息,例如“系泊点数字不正确”(我猜这是关于什么)。

答案 2 :(得分:0)

如果您想要Number2的值,请使用:

Number2\s*=\s*([^;"]*)[;"]

然后使用第一个捕获组。

答案 3 :(得分:0)

愚蠢的问题:为什么不使用这个正则表达式/#!([0-9A-Z/-]{1,4})/

旁注:{1,4}阻止您将检索值04-072(长度为6个字符)。

希望有所帮助:)