我正在尝试创建一种表单,用户可以提交该表单并使用它查找和替换长字符串中的文本。但是,我要替换的许多字符串只有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));
}
答案 0 :(得分:1)
您可以使用两侧的单词边界声明(\b
)将缩写视为一个单独的单词:
preg_replace('/\bod\b/i', 'odometer', 'od test od test od.')
// "odometer test odometer test odometer."
如果您只想在字符串周围有空格时才进行匹配,请使用匹配空格((?<=
)的先行断言((?=
)和先行断言(\s
):< / p>
preg_replace('/(^|(?<=\s))od((?=\s)|$)/i', 'odometer', 'od test od test od.')
// "odometer test odometer test od."
请注意尾随时间段的区别方式。 (还请注意,preg_replace
可以将多个模式/替换映射作为数组。)
来自docs:
单词边界是主题字符串中当前位置的位置 字符和前一个字符都不匹配\ w或\ W(即 一个匹配\ w,另一个匹配\ W),或者匹配的开始或结尾 如果第一个或最后一个字符分别与\ w匹配,则为字符串。
\w
和\W
表示“单词”和“非单词”字符:
“单词”字符是任何字母或数字或下划线字符, 也就是说,任何可以成为Perl“单词”组成部分的字符。的 字母和数字的定义由PCRE的字符控制 表,并且如果进行特定于语言环境的匹配可能会有所不同。对于 例如,在“ fr”(法语)语言环境中,某些字符代码更大 重音字母使用的字符数超过128,并且与\ w匹配。