我正在尝试创建一个表单,用户可以提交并使用它来查找和替换长字符串中的文本。然而,我要替换的许多字符串只有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));
}
发布于 2018-06-24 08:09:09
您可以在两侧使用单词边界断言(\b
)将缩写作为单独的单词处理:
preg_replace('/\bod\b/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
可以将多个模式/替换映射作为数组。)
从docs
单词边界是主题字符串中当前字符和前一个字符不同时匹配\w或\W的位置(即一个匹配\w,另一个匹配\W),或者如果第一个或最后一个字符分别匹配\w,则为字符串的开头或结尾。
\w
和\W
指的是“单词”和“非单词”字符:
"word“字符是任何字母或数字或下划线字符,也就是说,可以是Perl "word”的任何字符。字母和数字的定义由PCRE的字符表控制,如果发生特定于区域设置的匹配,则可能会有所不同。例如,在"fr“(法语)区域设置中,一些大于128的字符代码用于重音字母,这些字符代码由\w.
匹配
https://stackoverflow.com/questions/51005953
复制相似问题