如果最后一个字符,如何排除正则表达式模式字符类中的字符?

时间:2013-07-15 01:02:32

标签: php regex character

很抱歉,如果问题措辞不当(或者已经问过。我真的试着找到它。)

是否有可能,如果角色类中的一个特定字符恰好是最后一个字符(虽然它仍然可以保留在其他地方),以便从匹配中排除它?我正在使用的类似于在较大的字符串中查找网址,并且需要在模式中包含句点,但如果最后一个字符是句点,则将其排除在句子的末尾。

所以在一个模式(其他网址)“(/ [a-aA-Z0-9._-] *)?”有没有办法排除最后一个时期,如果存在?请注意,上面特别是域之后的uri段,但我只想匹配

"/some_uri/segments.php"

中的

"www.domain.com/some_uri/segments.php" 

AND

"www.domain.com/some_uri/segments.php."

同时允许在uri中存在多个句号。

如果上述情况不明确,想象一下我要求一种方法来排除单词中的最后一个字母,当且仅当它是'z'时。因此'dozzer'和'dozzerz'在句子结构中都匹配为'dozzer'(所以......不匹配字符串END处的位置)。我玩过前瞻之类的东西,但还没有找到方法。我想知道这是不可能的(只有一个正则表达式)。

谢谢你的时间!

修改

我为没有让它更清楚而道歉,但我需要在文本块内执行匹配。我正在做的是浏览文本并查找所有网址并对其应用标记。因此,我不能利用位置运算符,例如$来匹配字符串的结尾。这是最大的问题。

除非其他人在此之后发布有效的答案,否则我认为我将不得不同意M477h3w1012,并得出结论认为仅在正则表达式内部无法完成。我需要在找到匹配项后执行条件检查,以确定它们是否有尾随期。但是,非常感谢大家的时间和帮助。 : - )

3 个答案:

答案 0 :(得分:1)


我不认为在单一的正则表达式检查中有可能...有人可能能够纠正我,但我现在不这么认为(或者我现在想不到优化的事情)。

另一方面,你可以做的是检查。首先通过初始替换功能运行输入以查看最后是否有点,如果有,则替换它。从那里你可以通过以前的正则表达式提供它。

所以这就是它的发展方式......

function dotCheck( $url ) {
  $noDotURL = preg_replace( '/\.+$/', '', $url );
  return $noDotURL;
}

urlCheck( dotCheck( $_POST['form'] ) );

urlCheck是主要检查它是否是一个有效的链接结构。正则表达式 - 以详细形式 - 检查任何点作为链接中的最后一个字符并删除它们。如果有人输入http://www.google.com,这应该有效。或http://www.google.com .....

快乐的脚本。

答案 1 :(得分:1)

是。一般来说,这样做:

(<stuff you want to match>)(<character to exclude if at the end>)?$

如果&lt;要匹配的东西&gt; 以量词结尾,则该量词需要非贪婪,以便排除的最后一个字符匹配(如果存在)。

然后使用第一个匹配组( $ 1 变量)。

但是,我发现你的正则表达式还有其他一些问题。

  • 如果您希望能够匹配多个字符,则需要在字符类中包含 / 。否则,您只需从第一个 / 匹配到下一个之前。
  • 我不确定为什么你最后会有。这使整个事物变得可选。

这个正则表达式将完成你所描述的:

(/[a-zA-Z0-9._/-]*?)(\.)?$

匹配变量 $ 1 将包含从第一个 / 开始到结尾的所有内容,但如果有的话,则排除最后一个点(该点将位于 $ 2 )。

答案 2 :(得分:0)

编辑:正如Adi Inbar注意到的那样,你的目标不是让模式失败,而是排除字符串末尾或单词末尾的特定字符:

在单词的末尾排除'z'(最后几个'z'也被排除在外)

有一个字符类和占有量词:

(?>[^\Wz]++|z++\B)+ # the most performant way

排除'。'在一个字符串的末尾(最后几个'。'也被排除在外)

带着前瞻:

^.+?(?=\.*$)

或使用角色类和占有量词:

(?>[^.]++|\.++(?!$))+

请注意,您可以轻松地将此表达式调整为您需要的更具体的字符类,例如使用[\w.-]表示uri:

$pattern = '~(?>/[\w.-]++)*/(?>[\w-]++|\.++(?!$))+/?~';