Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Preg_替换和iso-8859-1字符匹配_Php_Regex_Iso 8859 1 - Fatal编程技术网

Php Preg_替换和iso-8859-1字符匹配

Php Preg_替换和iso-8859-1字符匹配,php,regex,iso-8859-1,Php,Regex,Iso 8859 1,preg_replace函数有问题 在我的代码中,我将使用它删除字符串开头不是字母或数字的所有字符 这很好,但是当$string包含iso-8859-1字符,如“è,ò,ù,ì”时,会认为没有单词,并且所有单词都被删除 preg_replace('/^[^a-zA-Z0-9]+/', '', $string); 例如,如果$string包含èxample则输出为xample 我需要包括这些iso-8859-1元音 有人能解决这个问题吗?试试看 $string = "1èxample"; $r

preg_replace函数有问题

在我的代码中,我将使用它删除字符串开头不是字母或数字的所有字符

这很好,但是当$string包含iso-8859-1字符,如“è,ò,ù,ì”时,会认为没有单词,并且所有单词都被删除

preg_replace('/^[^a-zA-Z0-9]+/', '', $string);
例如,如果
$string
包含
èxample
则输出为
xample

我需要包括这些iso-8859-1元音

有人能解决这个问题吗?

试试看

$string = "1èxample";
$r = preg_replace('/^[^\p{L}\p{Nd}]+/', '', $string);

echo $r;
测试

输出

1è示例

\p{L}
是任何语言中的任何字母。这和任何字母都匹配

\p{Nd}
是任何语言中的任何数字

有关更多详细信息,请参阅。

试试看

$string = "1èxample";
$r = preg_replace('/^[^\p{L}\p{Nd}]+/', '', $string);

echo $r;
测试

输出

1è示例

\p{L}
是任何语言中的任何字母。这和任何字母都匹配

\p{Nd}
是任何语言中的任何数字


有关更多详细信息,请参阅。

PCRE不支持Unicode块(在这种情况下,事情会容易得多),因此除了手动指定允许的字符集(或其否定)之外,您没有其他选择。正则表达式看起来像

[^a-zA-Z0-9\xC0-\xFF]+

问题是范围
\xC0-\xFF
还包括不需要的字符(例如除号,
\xF7
),因此您必须根据需要将其分解为可接受的子范围。请查看以帮助确定哪些字符是可以的,哪些不是。

PCRE不支持Unicode块(在这种情况下,事情会容易得多),因此除了手动指定允许的字符集(或其否定)之外,您没有其他选择。正则表达式看起来像

[^a-zA-Z0-9\xC0-\xFF]+

问题是范围
\xC0-\xFF
还包括不需要的字符(例如除号,
\xF7
),因此您必须根据需要将其分解为可接受的子范围。查看以帮助确定哪些字符是可以的,哪些不是。

“ISO字符”没有多大意义;如果字符串是用ISO-8859编码的,那么它不能包含任何“其他”字符,因此不需要清理它。你是说ISO-8859-1中所有可编码的字符吗?或者这仅仅是你说“一些有口音的角色”的方式?如果是前者:最慢的方法是往返转换到ISO-8859-1,以丢弃该编码中无法表示的所有字符。如果是后者,请指定要保留的确切字符集。“ISO字符”没有多大意义;如果字符串是用ISO-8859编码的,那么它不能包含任何“其他”字符,因此不需要清理它。你是说ISO-8859-1中所有可编码的字符吗?或者这仅仅是你说“一些有口音的角色”的方式?如果是前者:最慢的方法是往返转换到ISO-8859-1,以丢弃该编码中无法表示的所有字符。如果是后者,请指定要保留的确切字符集。“任何语言中的任何字母”-也使用西里尔语?希伯来语?韩国人这就是OP想要的吗?是的,也匹配西里尔字母。还有日语、汉语。。。。我不知道,如果这是OP想要的,那是我的假设。@stema:OP对ISO-8859-1特别感兴趣,所以这似乎太自由了。@Jon使用Unicode属性查找字母真的有伤害吗?如果OP有一些ISO-8859-1编码的数据,它只能找到其中的字母,没有西里尔字母或日语字母,它们不能在源数据中。它的可读性比使用某个范围要好得多,我需要代码页来查看它们匹配的内容。(我不是php专家,所以我不知道php在内部对字符串做什么,如果在非Unicode字符串上使用Unicode属性,可能会出问题!?)@stema:好吧,首先,你需要添加一个字符串,这样才能工作。该修饰符假设模式和主题都是UTF-8,所以您需要首先转换(在ISO-8859-1输入中很难失败)。最后,它会慢很多。除此之外,“任何语言的任何字母”-也这么西里尔文?希伯来语?韩国人这就是OP想要的吗?是的,也匹配西里尔字母。还有日语、汉语。。。。我不知道,如果这是OP想要的,那是我的假设。@stema:OP对ISO-8859-1特别感兴趣,所以这似乎太自由了。@Jon使用Unicode属性查找字母真的有伤害吗?如果OP有一些ISO-8859-1编码的数据,它只能找到其中的字母,没有西里尔字母或日语字母,它们不能在源数据中。它的可读性比使用某个范围要好得多,我需要代码页来查看它们匹配的内容。(我不是php专家,所以我不知道php在内部对字符串做什么,如果在非Unicode字符串上使用Unicode属性,可能会出问题!?)@stema:好吧,首先,你需要添加一个字符串,这样才能工作。该修饰符假设模式和主题都是UTF-8,所以您需要首先转换(在ISO-8859-1输入中很难失败)。最后,它会慢很多。除此之外,它还可以工作。完美的解决方案。定义范围是完美的。preg_replace('/[^a-z0-9\xC0-\xD6\xD8-\xF6\xF8-\xFF]+/i','$str);使用这个ignore case regexp,您还可以排除除法(D7)和moltiplication(F7)。完美的解决方案。定义范围是完美的。preg_replace('/[^a-z0-9\xC0-\xD6\xD8-\xF6\xF8-\xFF]+/i','$str);使用这个ignore case regexp,还可以排除除法(D7)和moltiplication(F7)。