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

Php 如果是最后一个字符,如何排除正则表达式模式字符类中的字符?,php,regex,character,Php,Regex,Character,对不起,如果这个问题措辞不当(或者已经被问过了,我真的很想找到它) 如果某个字符类中的某个特定字符恰好是最后一个字符(尽管它仍可以保留在其他位置),是否可以将其从匹配中排除?我所使用的类似于在更大的字符串中查找URL,并且需要在模式中包含句点,但是如果最后一个字符是句点,则将其排除在句子末尾 因此,在模式(其他url内容)“(/[a-zA-Z0-9.-]*)”中,是否有方法仅排除最后一个句点(如果存在)?请注意,上面是域后面的uri段,但我只想匹配 "/some_uri/segments.php

对不起,如果这个问题措辞不当(或者已经被问过了,我真的很想找到它)

如果某个字符类中的某个特定字符恰好是最后一个字符(尽管它仍可以保留在其他位置),是否可以将其从匹配中排除?我所使用的类似于在更大的字符串中查找URL,并且需要在模式中包含句点,但是如果最后一个字符是句点,则将其排除在句子末尾

因此,在模式(其他url内容)“(/[a-zA-Z0-9.-]*)”中,是否有方法仅排除最后一个句点(如果存在)?请注意,上面是域后面的uri段,但我只想匹配

"/some_uri/segments.php"
两者

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

同时允许uri中存在多个句点

如果上面的内容不清楚,想象一下,我正在寻求一种排除单词中最后一个字母的方法,当且仅当它是一个“z”。因此,“dozzer”和“dozzerz”在句子结构中都匹配为“dozzer”(因此……与字符串末尾的位置不匹配)。我和长相怪之类的人玩过,但还没找到办法。我想知道这是否是不可能的(仅在一个正则表达式中)

谢谢你的时间

编辑

我很抱歉没有说得更清楚,但我需要在一块文本中执行匹配。我所做的是浏览文本,找到所有的网址,并对它们应用标记。因此,我不能使用位置运算符,例如$来匹配字符串的结尾。这是最大的问题

除非其他人发布了一个在这之后有效的答案,否则我想我必须同意M477h3w1012,并得出结论,这不可能仅在正则表达式内部完成。在找到匹配项之后,我需要执行一个条件检查,以确定它们是否有尾随周期。但再次感谢大家,非常感谢你们的时间和帮助。:-)


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

另一方面,你能做的是进行检查。首先通过initialreplace函数运行输入,查看末尾是否有点,如果有点,则进行替换。从那里,您可以通过前面的正则表达式来输入它

这就是它的发展方向

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

urlCheck( dotCheck( $_POST['form'] ) );
其中urlCheck是主要检查,以查看它是否是有效的链接结构。正则表达式以详细的形式检查链接中最后一个字符的点并将其删除。如果有人输入,这应该可以工作。或者


愉快的脚本编写。

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

在一个词的结尾处排除一个“z”:(结尾处的几个“z”也被排除在外)

使用字符类和所有格量词:

(?>[^\Wz]++|z++\B)+ # the most performant way
(?>[^.]++|\.++(?!$))+
要在字符串末尾排除“.”,请执行以下操作:(末尾的几个“.”也被排除)

展望未来:

^.+?(?=\.*$)
或者使用字符类和所有格量词:

(?>[^\Wz]++|z++\B)+ # the most performant way
(?>[^.]++|\.++(?!$))+
请注意,您可以轻松地将此表达式调整为所需的更具体的字符类,例如uri的
[\w.-]

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

对。一般而言,请执行以下操作:

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

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

这些都不起作用
+[^.]$
不是解决方案,因为如果匹配以给定字符结束,他不想让匹配失败。如果字符位于字符串末尾,他希望将其从匹配中排除<如果字符串以点结尾,则code>+[^.]$将完全不匹配任何内容。由于相同的原因,
+$(?将使正则表达式在最后一个字符为点时失败,而不是从匹配中排除该点。标记位于末尾,因为基本域模式匹配(已排除)发生在给定的正则表达式之前,但我也希望包含没有尾随uri段的域,因此是可选的。您是对的,该示例过于简化,并且确实需要/(以及#等)。感谢您的帮助,这将起作用,除非我说我需要在更大的字符串中匹配模式(段落)场景,因此我无法使用$匹配位置。