正则表达式替换数据中的字符

时间:2011-09-13 16:25:14

标签: php regex data-cleansing

我正在尝试清理一些特殊字符的垃圾数据(允许一些),但有些仍然可以通过。我之前找到了一个正则表达式片段,但没有删除一些字符,如星号。

  $clean_body = $raw_text;

  $clean_title = preg_replace("/[^!&\/A-Za-z0-9_ ]/","", $clean_body);
  $clean_title = substr($clean_title, 0, 64);

  $clean_body = nl2br($clean_body);  

  if ($nid) {
    $node = node_load($nid);
    unset($node->field_category);
  } else {
    $node = new stdClass();
    $node->type = 'article';
    node_object_prepare($node); 
  }

  $split_title = str_split($clean_title);

  foreach ($split_title as $key => $character) {
    if ($key > 15) {
      if ($character == ' ' && !preg_match("/[^!&\/,.-]/", $split_title[$key - 1])) {
        $node->title = html_entity_decode(substr(strip_tags($clean_title), 0, $key - 1)) . '...';
      }
    }
  }

第一部分尝试清除原始文本中不是正常标点符号或字母数字的任何内容。然后,我将标题分成一个数组并寻找一个空格。我想要做的是创建一个至少15个字符长的标题,并在空格上截断(保持整个单词完整)而不停在标点字符上。这是我遇到麻烦的部分。

当第一个标题甚至不应该有*****************时,某些标题仍然是** HOW TO MAKE $$$$$$ BLOGGING ***,而该部分应该是HOW TO MAKE...,例如

2 个答案:

答案 0 :(得分:0)

"/[^!&\/\w\s]/ui"怎么样? 在我的机器上正常工作

答案 1 :(得分:0)

你的问题(或其中一个)无论如何都是这个逻辑:

if ($key > 15) {
  if ($character == ' ' && !preg_match("/[^!&\/,.-]/", $split_title[$key - 1])) {
    $node->title = html_entity_decode(substr(strip_tags($clean_title), 0, $key - 1)) . '...';
  }
}

如果在迭代$node->title数组中的字符时这些条件匹配,则只设置$split_title

当它们不匹配时会发生什么? $node->title没有被设置(或被覆盖?你没有提供太多的背景,所以我无法分辨)。

将此作为测试:

$clean_body = '** HOW TO MAKE $$$$$$ BLOGGING **';

您可以看到这些条件不匹配,因此$node->title未设置(或覆盖)。