该表达式/[^a-z0-9-]+/i将匹配(并随后用空格替换)除az 和 0-9 之外的任何字符。^in [^...]表示否定其中包含的字符集。
[^a-z0-9]匹配任何非字母数字字符
+指上述一项或多项
/i使其不区分大小写匹配
表达式/\&#?[a-z0-9]{2,4}\;/匹配 a&后接可选#, 后接两到四个字母和数字,以 a 结尾;这将匹配 HTML 实体,如 or'
&#?匹配&或&#匹配?前面的#可选 The&实际上不需要转义。
[a-z0-9]{2,4}匹配两到四个字母数字字符
;是文字分号。它实际上不需要转义。
部分正如您所怀疑的那样,最后一个将替换任何标签,如<tagname>or<tagname attr='value'>或</tagname>用空白空间。请注意,它匹配整个标签,而不仅仅是<>.
<是文字字符
[^>]+是每个字符直到但不包括下一个>
>是文字字符
我真的建议将其重写为三个单独的调用preg_replace()而不是嵌套它们。
// Strips tags.
// Would be better done with strip_tags()!!
$texts = preg_replace('/<[^>]+>/', ' ', $texts);
// Removes HTML entities
$texts = preg_replace('/&#?[a-z0-9]{2,4};/', ' ', $texts);
// Removes remainin non-alphanumerics
$texts = preg_replace('/[^a-z0-9-]+/i', ' ', $texts);
$array = explode(' ', $texts);