0

谁能帮我解释preg_replace()下一行的用法:

if ( isset( $data['title'] ) ) $this->title = preg_replace ( "/[^\.\,\-\_\'\"\@\?\!\:\$ a-zA-Z0-9()]/", "", $data['title'] );
 // $title is variable for storing title of a blog post

这是设置变量属性的完整构造函数代码:

public function __construct( $data=array() ) {
    if ( isset( $data['id'] ) ) $this->id = (int) $data['id'];
    if ( isset( $data['publicationDate'] ) ) $this->publicationDate = (int) $data['publicationDate'];
    if ( isset( $data['title'] ) ) $this->title = preg_replace ( "/[^\.\,\-\_\'\"\@\?\!\:\$ a-zA-Z0-9()]/", "", $data['title'] );
    if ( isset( $data['summary'] ) ) $this->summary = preg_replace ( "/[^\.\,\-\_\'\"\@\?\!\:\$ a-zA-Z0-9()]/", "", $data['summary'] );
    if ( isset( $data['content'] ) ) $this->content = $data['content'];
  }

我无法理解preg_replace这里的用法和需要。帮我解释一下 - 在此先感谢

4

2 回答 2

2

看起来无论是谁写的都对转义字符有点疯狂,而字符类中的大多数字符都不需要转义字符。这个正则表达式可以重写为

/[^.,\-_'"@?!:$ a-zA-Z0-9()]/ <-- note that only the dash needs to be escaped here

这基本上是说评估的字符串不能包含以下任何字符:

.,-_'"@?!:$ a-zA-Z0-9()

这是因为字符类中的开头克拉^使它成为否定类。

这里的预期用途是通过替换为空字符串从输出中删除不在该列表中的字符。所以如果你有类似的东西

$this->title = 'Here is a bad symbol >';

这将变成:

'Here is a bad symbol '
于 2013-10-09T22:17:03.050 回答
1

preg_replace 查找“搜索模式”并将找到的子字符串替换为值,因此preg_replace ( "/[^\.\,\-\_\'\"\@\?\!\:\$ a-zA-Z0-9()]/", "", $data['title'] )查找一些符号并将它们替换为空字符串

pattern /[^...]/ 表示 - 所有不在此列表中的符号即此代码用空字符串替换所有非字母数字和一些标点符号,因此,文本 likea#b将是 just ab,但a?b会是a?bas ? 在“允许”符号中。

不要对许多 \ 符号感到困惑 - 它们只需要转义,所以基本上允许的符号列表是.,-_'"@?!:$ a-zA-Z0-9()

于 2013-10-09T22:03:59.013 回答