删除未附加到php中相关文本的字符串块

时间:2012-11-16 23:35:31

标签: php regex preg-replace

需要删除未附加到a-zA-Z0-9的任何字符集。例子:

  • 太好了! (这里无事可做)
  • 是的,这也没关系!? (这里无事可做)
  • 这是!!!不是很好。 !!!!!!! - > 这个并不好。 (检测到块)
  • 浪费太多时间......对吧? - > 浪费的时间太多了吗? (检测到块)
  • .... {{.....块开头 - > 块位于开头(检测到块)
  • 块结尾[[]] - > 块末尾(检测到块)
  • 你好[[[[[[]]]]]]朋友.....?你好吗[}}}}}} - > 你好朋友.....?你是如何(检测到的块)

块被认为是任何独立的字符或字符串:

  • 与a-zA-Z0-9
  • 不同
  • 在任何位置(开始,中间,结束)
  • 不以任何方式与任何字母数字字符联系

4 个答案:

答案 0 :(得分:1)

正则表达式,匹配1个或多个不是触摸有效字符的非字母数字字符。

/(^| )[^a-zA-Z0-9]+( |$)/

PHP用法:

preg_replace('/(^| )[^a-zA-Z0-9]+( |$)/', '$1$2', $item);

注意:在针对您的输入进行操作时,您会注意到一些额外的空格。从技术上讲,这些空间触摸一个有效的角色。

答案 1 :(得分:1)

您可以使用lookarounds。我们可以简单地匹配尽可能多的非单词,非空格字符,然后断言块旁边没有非空格字符:

$output = preg_replace('/(?<!\S)[^a-z\d\s]+(?!\S)/i', '', $input);

请注意,这可能会留下多个空格字符(块的左侧和右侧)。如果您不想这样,最简单的方法是运行第二个替换步骤:

$output = preg_replace('/\s+/', ' ', trim($output));

答案 2 :(得分:1)

在这里,试试这个:

'/(?:(?<=\s)|^)[^a-z0-9]+(?:(?=\s)|$)/i'

http://codepad.org/2JZLHdhL

基本思想是:使用lookbehind断言我们要么在我们后面有空格,要么在字符串的开头。然后捕获非字母数字字符,并使用前瞻来强制它遵循空格或字符串的结尾。

答案 3 :(得分:0)

这是您需要的

[^a-zA-Z0-9\d\s:]+[^a-zA-Z0-9\d\s:]

这样只会选择任何没有附加到字母数字字符的字母数字字符