Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何改进我的算法?/搜索并替换格式化文本中的单词/_Php_String_Algorithm_Formatted Text - Fatal编程技术网

Php 如何改进我的算法?/搜索并替换格式化文本中的单词/

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

我有一个html源代码和一组关键字。我试图在关键字数组中找到以任何关键字开头的所有单词,并将其包装在链接标记中

例如,关键字数组有两个值:
[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);
}
我的问题是:

  • 这个算法有效吗
  • 我将如何修改它以使用UTF-8
  • 如何识别html中的超链接并忽略它们(不希望在超链接中放置超链接)
  • 这个算法安全吗

  • 为了最大限度地提高性能,您应该查看
    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#标记 */ //