很抱歉,如果问题措辞不当(或者已经问过。我真的试着找到它。)
是否有可能,如果角色类中的一个特定字符恰好是最后一个字符(虽然它仍然可以保留在其他地方),以便从匹配中排除它?我正在使用的类似于在较大的字符串中查找网址,并且需要在模式中包含句点,但如果最后一个字符是句点,则将其排除在句子的末尾。
所以在一个模式(其他网址)“(/ [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,并得出结论认为仅在正则表达式内部无法完成。我需要在找到匹配项后执行条件检查,以确定它们是否有尾随期。但是,非常感谢大家的时间和帮助。 : - )
答案 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-]++|\.++(?!$))+/?~';