我相对较新的php,希望有人可以帮我替换正则表达式,或者可能是匹配替换我不太确定。
我想自动加粗(第二次出现一场比赛),然后第四次出现一场斜体,然后是第7次出现的比赛下划线。
这基本上是针对内容中的搜索引擎优化目的。
我已经完成了一些替换:并且认为这应该可以解决问题吗?
preg_replace( pattern, replacement, subject [, limit ])
我已经知道我想在
中使用的单词'pattern' is also a word that is already defined like [word].
`replacement` 'This is a variable I am getting from a mysql db.
'subject' - The subject is text from a db.
让我说我有这样的内容:这或多或少解释了我想做什么。
这是我要替换的文本示例。在本文中,我想要第二次出现 example <胆大。然后我想跳过下一次在文本中出现的例子,并在第4次单词 example 以斜体显示。然后我想跳过第5次单词示例出现在文本中,以及第6次,最后想要第7次example出现在文本下划线。在这个例子中,我使用了超链接作为下划线示例,因为我没有在文本编辑器中看到下划线功能。单词示例在文本中可能会出现更多次,但我唯一的重复是强调一次,粗体一次并使斜体变为一次。我可能稍后决定对“例子”这个词做一些引用,但它还不是优先事项。
如果没有至少7个单词的出现,代码也不要通过错误也很重要。
我将如何做到这一点,任何想法都将不胜感激。
答案 0 :(得分:3)
正则表达式本身无法计数,preg_函数提供的帮助很少。你需要一个解决方法。如果您实际上只搜索一个单词,则可能需要使用字符串函数。否则试试:
// just counting
if (7 >= preg_match_all($pattern, $subject, $matches)) {
$cb_num = 0;
$subject = preg_replace_callback($pattern, "cb_ibu", $subject);
}
function cb_ibu($match) {
global $cb_num;
$match = $match[0];
switch (++$cb_num) {
case 2: return "<b>$match</b>";
case 4: return "<i>$match</i>";
case 7: return "<u>$match</u>";
default: return $match;
}
}
诀窍是有一个回调来进行记账。在那里添加任何规则都很容易。
答案 1 :(得分:3)
您可以使用preg_split
在匹配项中拆分文本,应用修改,然后将所有内容重新组合在一起:
$parts = preg_split('/(example)/', $str, 7, PREG_SPLIT_DELIM_CAPTURE);
if (isset($parts[3])) $parts[3] = '<b>'.$parts[3].'</b>';
if (isset($parts[7])) $parts[7] = '<i>'.$parts[7].'</i>';
if (isset($parts[13])) $parts[13] = '<u>'.$parts[13].'</u>';
$str = implode('', $parts);
第i场比赛的索引公式为 index = i ·2 - 1.
答案 2 :(得分:0)
这是一个有趣的问题。我的实施将是:
function replace_exact($word, $tag, $string, $limit) {
$tag1 = '<'.$tag.'>';
$tag2 = '</'.$tag.'>';
$string = str_replace($word, $tag1.$word.$tag2, $string, 1);
if ($limit==1) return $string;
return str_replace($tag1.$word.$tag2,$word,$string,$limit-1);
}
像这样使用:
echo replace_exact('Example', 'b', $source_text, 2);
echo replace_exact('Example', 'i', $source_text, 4);
我不知道这会有多快,但它会比preg_replace更快。