【问题标题】:Clean string using preg_replace, but admit latin characters使用 preg_replace 清理字符串,但允许使用拉丁字符
【发布时间】:2013-01-14 02:49:48
【问题描述】:

我想要做的是清理一个字符串(html 标签、额外的空格、引号......),但我想承认拉丁字符,如标点符号和ñ 字符。我试过这个,但我不知道为什么没有按预期工作:

代码

//Removing special characters
$str = preg_replace('/[^;\sa-zA-Z0-9áéíóúüñÁÉÍÓÚÜÑ]+/', '', $str);
//Deleting extra white spaces
$str = preg_replace('/\s+/', ' ', $str); 

示例

in:       Película; Films; @Cine; Añoranza; <html></body>foo "bar    ";
out:      pelcula; Films; Cine; Aoranza;  foo bar
expected: Película; Films; Cine; Añoranza; foo bar

问题:

我的代码有什么问题,我该如何解决?因为拉丁字符部分是唯一对表达式不起作用的部分。

另外:如何将两个正则表达式合并为一个?

【问题讨论】:

  • 试过'/[^;\sa-zA-Z0-9áéíóúüñÁÉÍÓÚÜÑ]+/u'?此外,刚刚经过测试,您的正则表达式会将 &lt;html&gt;&lt;/body&gt; 替换为 htmlbody,而不是您声称的输出。
  • mmm...我认为问题是Laravel框架或数据库
  • 看看这个fiddle
  • 正在php控制台上工作,但不在php文件o.O中
  • 那么你的文件可能不是UTF-8。尝试遵循@Esailija 的指示,看看是否有帮助。

标签: php regex character-encoding preg-replace


【解决方案1】:

如果您使用 UTF-8,则需要使用 u 标志。

$str = preg_replace('/[^;\sa-zA-Z0-9áéíóúüñÁÉÍÓÚÜÑ]+/u', '', $str);

确保你的数据库连接是 utf-8 和你的 php 源文件 物理编码是 utf-8,它会工作。不过,您的正则表达式不会神奇地变成一个 html 解析器。

【讨论】:

  • 数据库连接是 UTF-8,但使用 u 标志我得到preg_replace(): Compilation failed: invalid UTF-8 string at offset 15
  • @TomSarduy 您的 php 源文件不是 UTF-8,您使用的是什么文本编辑器?
  • 我使用的是 Sublime Text,如何设置?
  • @TomSarduy "default_encoding": "UTF-8" in preferences.sublime-settings
  • @TomSarduy 明确使用文件 -> 使用编码保存 -> UTF-8
【解决方案2】:

你也可以使用这个(更好看的)方法:

$str = preg_replace('/[^\p{Latin}]+/u', '', $str);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2021-01-11
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多