Php 如何改进我的算法?/搜索并替换格式化文本中的单词/
我有一个html源代码和一组关键字。我试图在关键字数组中找到以任何关键字开头的所有单词,并将其包装在链接标记中 例如,关键字数组有两个值:Php 如何改进我的算法?/搜索并替换格式化文本中的单词/,php,string,algorithm,formatted-text,Php,String,Algorithm,Formatted Text,我有一个html源代码和一组关键字。我试图在关键字数组中找到以任何关键字开头的所有单词,并将其包装在链接标记中 例如,关键字数组有两个值:[ABC,DEF]。它应该匹配ABCDEF,DEFAD等,并用超链接标记将每个单词包装起来 以下是我目前掌握的代码: $_keys = array('ABC', 'DEF'); $text = 'Some ABCDD <strong>HTML</strong> text. DEF'; function search_and_repla
[ABC,DEF]
。它应该匹配ABCDEF
,DEFAD
等,并用超链接标记将每个单词包装起来
以下是我目前掌握的代码:
$_keys = array('ABC', 'DEF');
$text = 'Some ABCDD <strong>HTML</strong> text. DEF';
function search_and_replace(($key,$text)
{
$words = preg_split('/\s+/', trim($text)); //to seprate words in $_text
for($words as $word)
{
if(strpos($word,$key) !== false)
{
if($word.startswith($key))
{
str_replace($word,'<a href="">'.$word.'</a>,$_text);
}
}
}
return text;
}
for($_keys as $_key)
{
$text = search_and_replace($key,$text);
}
$\u keys=array('ABC','DEF');
$text='一些ABCDDHTMLtext。定义';
函数搜索和替换($key,$text)
{
$words=preg_split('/\s+/',trim($text));//在$_text中分离单词
for($words作为$word)
{
if(strpos($word,$key)!==false)
{
if($word.startswith($key))
{
str_替换($word,,$_text);
}
}
}
返回文本;
}
用于($\键作为$\键)
{
$text=搜索和替换($key,$text);
}
我的问题是:
为了最大限度地提高性能,您应该查看
Trie
(与检索树
)数据结构。()如果我是你,我会首先构建一个Trie
,其中包含HTML页面中的单词。在这一步,你还可以检查单词是否在
标记中,如果是,那么就不要将其添加到Trie
。你可以通过Regex
匹配来轻松做到这一点,以最大限度地提高你应该查看的性能到Trie
(与检索树相同)数据结构。()如果我是你,我会首先构建一个Trie
,其中包含HTML页面中的单词。在这一步,你还可以检查单词是否在
标记中,如果是,那么就不要将其添加到Trie
。你可以通过Regex
匹配来轻松实现这一点
preg_match_all("/\b".$word."\B*\b/",$matches);
foreach($matches as $each) {
print($each[0]);
}
(对不起,我的PHP有点生锈)正则表达式怎么样
preg_match_all("/\b".$word."\B*\b/",$matches);
foreach($matches as $each) {
print($each[0]);
}
(对不起,我的PHP有点生疏)算法“正确”吗?(我读的是“准确”)
不,不是。因为str\u replace
一个字符串或数组,其中包含在主题中搜索的所有实例
替换为给定的替换值
您匹配的字符串并不是唯一被替换的字符串。以您的示例为例,如果您对数据集运行此函数,则最终会将每次出现的ABC
包装在多个标记中(只需运行代码即可查看,但您必须修复语法错误)
使用UTF-8字母表?
不确定,但正如我所写的,我不这么认为。参见。PREG函数应该是多字节安全的
我想在搜索操作中删除每个标签中的所有单词
这太难了。你必须避免;你可以修改它来轻松完成你想要的任务
更好的替代方法?
当然。你在这里展示的是最糟糕的方法之一。我建议你使用preg\u replace
(另一个答案对你想要的正则表达式有一个很好的开始,匹配的单词比空格更破烂)但由于您希望避免更改某些元素,我现在认为在JS客户端中这样做要好得多。算法“正确”吗?(我读的是“准确”)
不,不是。因为str\u replace
一个字符串或数组,其中包含在主题中搜索的所有实例
替换为给定的替换值
您匹配的字符串并不是唯一被替换的字符串。以您的示例为例,如果您对数据集运行此函数,则最终会将每次出现的ABC
包装在多个标记中(只需运行代码即可查看,但您必须修复语法错误)
使用UTF-8字母表?
不确定,但正如我所写的,我不这么认为。参见。PREG函数应该是多字节安全的
我想在搜索操作中删除每个标签中的所有单词
这太难了。你必须避免;你可以修改它来轻松完成你想要的任务
更好的替代方法?
当然。你在这里展示的是最糟糕的方法之一。我建议你使用preg\u replace
(另一个答案对你想要的正则表达式有一个很好的开始,匹配的单词比空格更破烂)但是,由于您希望避免更改某些元素,我现在认为在JS客户端中这样做要好得多。对于这样一个简单的任务将很好地发挥作用。其想法是查找所有超链接(以及可选的一些其他HTML元素)然后,我们可以自由地寻找和替换所需的关键字,最后我们将恢复删除的HTML元素
$_keys = array( 'ABC', 'DEF', 'ABČ' );
$text =
'Some <a href="#" >ABC</a> ABCDđD <strong>ABCDEF</strong> text. DEF
<p class="test">
<a href="#">PHP</a> is <em>the</em> most ABCwidely used
langČuage ABC for ABČogr ammDEFing on the webABC DEFABC.
</p>';
// array for holding html items replaced with tokens
$tokens = array();
$id = 0;
// we will replace all links and strong elements (a|strong)
$text = preg_replace_callback( '/<(a|strong)[^>]*>.*?<\/\1\s*>/s',
function( $matches ) use ( &$tokens, &$id )
{
// store matches into the tokens array
$tokens[ '#'.++$id.'#' ] = $matches[0];
// replace matches with the unique id
return '#'.$id.'#';
},
$text
);
echo htmlentities( $text );
/* - outputs: Some #1# ABCDđD #2# text. DEF <p class="test"> #3# is <em>the</em> most ABCwidely used langČuage ABC for pćrogrABCamming on the webABC DEFABC. </p>
- note the #1# #2# #3# tokens
*/
// wrap the words that starts with items in $_keys array ( with u(PCRE_UTF8) modifier )
$text = preg_replace( '/\b('. implode( '|', $_keys ) . ')\w*\b/u', '<a href="">$0</a>', $text );
// replace the tokens with values
$text = str_replace( array_keys($tokens), array_values($tokens), $text );
echo $text;
$_keys=array('ABC','DEF','ABČ');
$text=
'一些ABCDđDABCDEFtext.DEF
是使用最广泛的
在ABC DEFABC网站上为ABČogr AMMGING发布ABC语言。
';
//用于保存替换为标记的html项的数组
$tokens=array();
$id=0;
//我们将替换所有链接和强元素(a | strong)
$text=preg\u replace\u回调('/]*>。?/s',
函数($matches)使用(&$tokens,&$id)
{
//将匹配项存储到令牌数组中
$tokens['#'.+$id.#']=$matches[0];
//用唯一id替换匹配项
返回“#”。$id.#”;
},
$text
);
回音文本($文本);
/*-输出:在webABC DEFABC上,对于pć编程而言,一些1#D#D#2#text.DEF#3#是最常用的语言ABC
-注意#1#2#3#标记
*/
//