6

我正在逐行解析一些文本,如果给定的行以任何标点符号或数字结尾,我希望布尔返回 true。

正则表达式是最好的方法还是我应该使用一组字符进行迭代以匹配?感觉阵列太大而且成本太高...

如果这确实是一个好方法,有人可以帮助我使用正则表达式吗?

function ends_with_punctuation_or_num($string){
   // check if the string ends with punctuation or a number
    if (/* TODO */)
        return true;
    else
        return false;
}
4

5 回答 5

17

将其放入您的 if-check 中:

preg_match("/[0-9.!?,;:]$/", $string)

这将匹配字符串 ( $) 末尾之前的一个数字或任何给定的标点符号。将您想要视为匹配的任何其他标点字符添加到字符类(方括号)中。

于 2012-10-12T12:22:25.043 回答
5

标点符号的 unicode 属性 is\p{P}\p{Punctuation}数字 it's \pN

在 php 中,您可以使用:

preg_match('/[\p{P}\p{N}]$/u', $string);

如果字符串以标点符号或数字结尾,这将返回 true。

看看这个网站

于 2012-10-12T14:14:17.040 回答
1

echo substr("abcdef", -1); // returns "f"

http://php.net/manual/en/function.substr.php

于 2012-10-12T12:22:27.290 回答
0

我不确定我会使用正则表达式来做到这一点。这只是个人喜好,但正则表达式似乎不必要且可读性较差(它也较慢,但这在这里可能无关紧要)。我宁愿将我正在寻找的任何字符放入字符串中并进行比较:

$chars = '.,;\'"0123456789';
$last = substr($string, -1);

if(strpbrk($last, $chars) !== false) {}

显然,使用mb_substring()Unicode 代替。

也可以使用is_numeric()而不是将数字放入字符串中。但是我发现这更简单,更易读,并且以后更容易修改。

于 2012-10-12T17:11:02.983 回答
0

您可以使用substr 函数或 utf-8 mb_substr

$last = substr($string, -1);

if($last == '.' OR is_numeric($last)) {]

但是,如果您使用 UTF8 字符串,我建议您像这样使用它

mb_internal_encoding('utf-8');
$last = mb_substr($string, -1);
if($last == '.' OR is_numeric($last)) {}
于 2012-10-12T12:25:43.230 回答