PHP 使用 preg_replace 和 FOR 循环替换关键字
PHP keyword replacement using preg_replace and a FOR loop
我完全不知道这里出了什么问题。任何帮助将不胜感激。
我正在为 wordpress 网站制作关键字替换工具。我的问题是我的 preg_replace 在遍历 post 内容时似乎只在数组的最后一个元素上 运行。
下面的两个 get_options 只是文本区域字段,每个关键字和使用字符 returns 在单独的行上替换。
function keyword_replace($where) {
$keywords_to_replace = get_option('keywords_to_replace');
$keyword_links = get_option('keyword_links');
$KWs = explode("\n", $keywords_to_replace);
$URLs = explode("\n", $keyword_links);
$pattern = array();
$replacement = array();
for($i=0; $i< count($KWs); $i++) {
$pattern2 = '/<a[^>]*>(.*?)'.$KWs[$i].'(.*?)</a>/';
if(preg_match($pattern2, $where)) {
continue;
} else {
$pattern[$i] = '\'(?!((<.*?)|(<a.*?)))(\b'. $KWs[$i] . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'si';
$replacement[$i] .= '<a href="'.$URLs[$i].'" target="_blank">'.$KWs[$i].'</a>';
}
}
return preg_replace($pattern, $replacement, $where, -1);
}
add_filter('the_content','keyword_replace');
A var_dump() returns 所有正确的信息,转储中似乎没有任何内容被跳过。我一直在试图弄清楚为什么它不遍历整个数组。
感谢您的帮助,
拉斐尔
我有一个朋友帮我解决了这个问题。以防万一其他人遇到与我类似的问题,解决方法是在 $pattern[$i].
中围绕 $KWs[$i] 使用 trim() 命令
$pattern[$i] = '\'(?!((<.*?)|(<a.*?)))(\b'. trim($KWs[$i]) . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'si';
这一切都归结为 windows 与 mac 在角色 returns 上的对比。
我完全不知道这里出了什么问题。任何帮助将不胜感激。
我正在为 wordpress 网站制作关键字替换工具。我的问题是我的 preg_replace 在遍历 post 内容时似乎只在数组的最后一个元素上 运行。
下面的两个 get_options 只是文本区域字段,每个关键字和使用字符 returns 在单独的行上替换。
function keyword_replace($where) {
$keywords_to_replace = get_option('keywords_to_replace');
$keyword_links = get_option('keyword_links');
$KWs = explode("\n", $keywords_to_replace);
$URLs = explode("\n", $keyword_links);
$pattern = array();
$replacement = array();
for($i=0; $i< count($KWs); $i++) {
$pattern2 = '/<a[^>]*>(.*?)'.$KWs[$i].'(.*?)</a>/';
if(preg_match($pattern2, $where)) {
continue;
} else {
$pattern[$i] = '\'(?!((<.*?)|(<a.*?)))(\b'. $KWs[$i] . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'si';
$replacement[$i] .= '<a href="'.$URLs[$i].'" target="_blank">'.$KWs[$i].'</a>';
}
}
return preg_replace($pattern, $replacement, $where, -1);
}
add_filter('the_content','keyword_replace');
A var_dump() returns 所有正确的信息,转储中似乎没有任何内容被跳过。我一直在试图弄清楚为什么它不遍历整个数组。
感谢您的帮助, 拉斐尔
我有一个朋友帮我解决了这个问题。以防万一其他人遇到与我类似的问题,解决方法是在 $pattern[$i].
中围绕 $KWs[$i] 使用 trim() 命令$pattern[$i] = '\'(?!((<.*?)|(<a.*?)))(\b'. trim($KWs[$i]) . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'si';
这一切都归结为 windows 与 mac 在角色 returns 上的对比。