如何在 php 中仅当被空格包围时才替换文本



我正在尝试创建一个表单,用户可以提交该表单并用于查找和替换长字符串中的文本。但是,我替换的许多字符串只有 2-3 个字母(例如"od"、"ph"(,这些字母经常出现在单词中间。我想遍历我正在搜索的所有短语,并且仅在字符串前有空格时才替换它们,以避免替换单词中间的字符串。有什么想法吗?

if(isset($_POST["text"]))
{
$original = $_POST["text"];
$abbreviation= array();
$abbreviation[0] = 'od';
$abbreviation[1] = 'rn';        
$abbreviation[2] = 'ph';
$abbreviation[3] = 'real';  
$translated= array();
$translated[0] ='odometer';
$translated[1] ='run';
$translated[2] ='pinhole';
$translated[3] ='fake';
$newtext=  str_ireplace ($abbreviation, $translated ,$original);
echo nl2br(htmlspecialchars($newnote));
}

您可以将缩写视为一个单独的单词,在两侧使用单词边界断言 (b(:

preg_replace('/bodb/i', 'odometer', 'od test od test od.')
// "odometer test odometer test odometer."

如果您严格希望仅在字符串周围有空格时才匹配,请使用后视断言 ((?<=( 和前瞻断言 ((?=( 匹配空格 (s(:

preg_replace('/(^|(?<=s))od((?=s)|$)/i', 'odometer', 'od test od test od.')
// "odometer test odometer test od."

请注意尾随周期的处理方式不同。(另请注意,preg_replace可以将多个模式/替换映射作为数组。

从文档中:

单词边界是主题字符串中当前 字符和前一个字符不都匹配 \w 或 \W(即 一个匹配 \w,另一个匹配 \W(,或 如果第一个或最后一个字符分别与 \w 匹配,则为字符串。

wW是指"单词"和"非单词"字符:

"单词"字符是任何字母或数字或下划线字符, 也就是说,任何可以成为Perl"单词"一部分的字符。这 字母和数字的定义由 PCRE 的字符控制 表,如果正在进行特定于区域设置的匹配,则可能会有所不同。为 例如,在"fr"(法语(区域设置中,某些字符代码更大 重音字母使用 128 个以上,这些字母由 \w 匹配。

最新更新