允许嵌套 HTML 元素
使用模式 [^<]+ 替换 HTML 元素并不好,因为它会阻止嵌套元素。
本节介绍了一个非常优雅的解决方案。
通常点 (.) 字符不会匹配所有字符,例如换行符和换行符,因此我们不能使用像 (.*?) 这样的模式来匹配 HTML 元素中的所有内容——但是如果我们使用 s 和我们的代码:
$str = '<p>My first Website.</p>'; $new_str = preg_replace('|<p>(.*?)</p>|su', "<div></div>", $str); echo $new_str;
输出:
<div>My first Website.</div>
模式中的问号使表达式非贪婪,这意味着它只会匹配到结束 </p>
使用正则表达式
正则表达式可用于更复杂的替换,例如替换 HTML 元素时。
在 PHP 中,我们可以使用 preg_replace 函数来执行正则表达式的替换。
有些人可能会发现它比使用 str_replace 执行替换更复杂,并且从某种意义上说,我们需要学习如何编写正则表达式,但努力是值得的,因为我们可以在许多不同的情况下使用它。
下面是简单的正则表达式,它将用一个空格替换多个空格字符。
preg_replace('/\s\s+/', ' ', $str);
在这种情况下,“s”是不同空白字符的短“代码”,“+”号可以翻译为“一个或者多个”。
该表达式的含义如下:如果至少存在一个空格字符,然后是一个或者多个,请用单个空格替换此“匹配模式”。
有时我们可能想“记住”源字符串的某些部分,而只替换其他部分。
例如,我们可以记住一个 HTML 元素的内容,并且只替换元素标签。
在下面的例子中,我们想用 div 标签替换段落标签,为此我们可以“记住”内容,并替换它周围的 <p> 标签。
例如
$str = '<!DOCTYPE html> <html> <head> <title>My first Website</title> </head> <body> <p>My first Website.</p> </body> </html>'; $new_str = preg_replace('|<p>([^<]*)</p>|su', "<div></div>", $str); echo $new_str;
上面 $str 变量中用来匹配模式的正则表达式比较简单:
|<p>([^<]+)</p>|u
括号内的部分匹配内容,基本上匹配除小于号(<)之外的所有字符。
因此是“[^<]”部分。
我们之前已经解释了加号。
最后的部分,你是修饰符。
在这种情况下,我使用了 u ; u 修饰符将导致模式和主题字符串被视为 UTF-8 。
方括号 ([]) 用于匹配一系列无序字符;在这种情况下,我们使用插入符号/circumflex/hat 符号来说明不应匹配哪些字符。
括号用于将匹配项记住为“反向引用”,这允许我们将其插入到替换字符串中。
可以通过数字变量访问反向引用: $1, $2 ,$3 。
等等。
对于嵌套括号,匹配项按照它们匹配的顺序从内到外存储 - 就像洋葱的层一样。
这可以通过视觉表示来显示:
( // ( // ( // ) ) )
因此,每当我们使用表达式和嵌套括号时,请记住这一点。
在表达式中使用反向逻辑通常是个好主意。
例如,不是列出我们允许的所有字符,而是使用方括号内的插入符号简单地列出我们不允许的字符通常要容易得多。
然而,当使用 HTML 时,这可能会阻止嵌套元素——更多关于嵌套元素的部分!
最后,preg_replace 也以与 str_replace 相同的方式处理数组。
$source_str = "...target1...target2...<u>target3</u>..."; $targets = array('#([^<]*)#', '#([^<]*)#', '#<u>([^<]*)</u>#'); $replacements = array("", "<em></em>", "<span></span>"); $new_str = preg_replace($targets, $replacements_arr, $source_str); echo $new_str;
要替换字符串中的子字符串,我们可以使用字符串替换函数,也可以为更复杂的替换创建正则表达式。
替换字符串的一种简单方法是使用 str_replace(对于区分大小写的替换)或者 stri_replace(对于不区分大小写的替换);但是我们也可以使用 preg_replace 来执行正则表达式替换。
PHP 的原生 str_replace 函数用于将给定字符串的所有出现替换为替换字符串;但是使用正则表达式将允许更复杂的基于模式的替换,这对于处理 HTML、CSS 和 JavaScript 内容非常有用。
用 str_replace 替换字符串
str_replace 函数可以通过为它提供目标字符串、替换字符串和源字符串来使用。
可以使用裸字符串、变量和数组。
第一个示例使用裸字符串:
$source_str = "...target1...target2...target3...target4"; echo str_replace("target2", "replacement2", $source_str);
也可以使用包含要替换的不同字符串的数组。
替换将按照数组的顺序进行:
$source_str = "...target1...target2...target3...target4"; $targets = array("target1", "target2", "target3"); $replacements = array("replacement1", "replacement2", "replacement3"); $new_str = str_replace($targets, $replacements, $source_str); echo $new_str;
要执行不区分大小写的匹配,可以使用 stri_replace 函数。