高亮显示匹配的数据仅适用于匹配的单个值



如以下代码所示,我想打印$input,但要突出显示来自$match的匹配值

它有效,但它只突出显示单个值,其他值都不是

<?php
$input = Array ( 'https://www.imdb.com/title/tt5294518/' , 'https://www.imdb.com/title/tt6924650/' , 'https://www.imdb.com/title/tt7313348/' , 'https://www.imdb.com/title/tt9134216/' , 'https://www.imdb.com/title/tt9586294/' , 'https://www.imdb.com/title/tt3256226/' );
$match = Array ( 'tt3256226' , 'tt7313348' , 'tt5294518' ) ;
foreach ($input as $index => $row){
foreach ($match as $key => $value){
}
echo "<div>" , ($index + 1) , '- ', (str_replace($match,"<strong><font color='blue'>" . $value . "</strong></font>",$row)) , "</div>";
}

这是下图中的输出https://i.ibb.co/DMDpgzd/Untitled.jpg

这是真正完整的代码:

<!DOCTYPE html>
<html>
<head>
<title>Check IMDB</title>
</head>
<body>
<div class="container">
<form method="POST" action="">
<input type="submit" value="&nbsp;&nbsp;Check IMDB&nbsp;&nbsp;">
<div>
<textarea style="width: 50%; margin-top:7px; height: 150px;" name="urlbox" placeholder="Add IMDB links here (one per line)"></textarea>
</div>
</form>
</div>
<?php
$imdblink = "";
$imdblink = $_POST['urlbox'];
?>
<?php
set_time_limit(0);
require(dirname(__FILE__) . '/wp-load.php');
global $wpdb;
$array = explode(PHP_EOL, $imdblink);
$matches = preg_match_all('(tt[0-9]+)', $imdblink, $imdbid);
$imdbid = $imdbid[0];
$imdbid = preg_filter('/^/', ''', $imdbid);
$imdbid = preg_filter('/$/', ''', $imdbid);
$imdbids = join(',', $imdbid);
$imdbids = $wpdb->get_results("SELECT * FROM wp_postmeta WHERE meta_key LIKE 'imdb' AND meta_value IN ($imdbids)");
$imdbids = array_column($imdbids, "meta_value");
foreach ($array as $index => $url) {
if (in_array(basename($url), $imdbids)) {
$url = '<a href="' . $url . '" class="strong blue">' . $url . '</a>';
}
echo "<div>" , ($index + 1) , "- {$url}</div>n";
}
?>
</body>
</html>

在文本区域输入

https://www.imdb.com/title/tt5294518/
https://www.imdb.com/title/tt6924650/
https://www.imdb.com/title/tt7313348/
https://www.imdb.com/title/tt9134216/
https://www.imdb.com/title/tt9586294/
https://www.imdb.com/title/tt3256226/

$array的输出

Array ( [0] => https://www.imdb.com/title/tt5294518/ [1] => https://www.imdb.com/title/tt6924650/ [2] => https://www.imdb.com/title/tt7313348/ [3] => https://www.imdb.com/title/tt9134216/ [4] => https://www.imdb.com/title/tt9586294/ [5] => https://www.imdb.com/title/tt3256226/ ) 

$imdbids的输出

Array ( [0] => tt3256226 [1] => tt7313348 [2] => tt5294518 ) 
  • 使用preg_match_all()仅提取/隔离提交的ttid(无需分解(。使用捕获组(()(写入模式将不必要地使匹配数组中的数据量膨胀/翻倍。您打算每次使用整个(fullstring(匹配字符串,这将存储在matches数组的[0]子数组中。该模式需要匹配两个文字t字符,然后匹配七到八个数字——这就是ttd{7,8}所做的。

  • 然后通过硬编码第一个和最后一个单引号并使用','作为连接胶来构造查询的IN参数——这将充分地将每个匹配的ttid括起来。然后,结果集的meta_value列将在您迭代先前匹配的ttid时充当查找数组。如果输入的ttid与查找匹配,请将该条目转换为可单击的链接。

    $input = 'https://www.imdb.com/title/tt5294518/
    https://www.imdb.com/title/tt6924650/
    https://www.imdb.com/title/tt7313348/
    https://www.imdb.com/title/tt9134216/
    https://www.imdb.com/title/tt9586294/
    https://www.imdb.com/title/tt3256226/';
    if (!preg_match_all('~ttd{7,8}~', $input, $ttids)) {
    echo "no ttids found";
    } else {
    $resultSet = $wpdb->get_results("SELECT meta_value FROM wp_postmeta WHERE meta_key = 'imdb' AND meta_value IN ('" . implode("','", $ttids[0]) . "');");
    $foundInDatabase = array_column($resultSet, "meta_value");
    foreach ($ttids[0] as $index => $ttid) {
    if (in_array($ttid, $foundInDatabase)) {
    $ttid = "<a class="strong blue" href="https://www.imdb.com/title/{$ttid}/">{$ttid}</a>";
    }
    echo "<div>" , ($index + 1) , "- {$ttid}</div>";
    }
    }
    

其他注意事项。。。

IMDB tt ID将有7到8位数字,并且在url中只出现一次。

相关资源:

  • https://github.com/tboothman/imdbphp/issues/163(7或8位数字(
  • https://en.wikipedia.org/wiki/Template:IMDb_title

如果需要利用通配符(_%(,则只应在sql查询中使用LIKE。进行文字匹配时,只需使用=

在构建html时,我建议您远离简单的<br>元素,开始将内容封装在有意义的标记中,这些标记可以由外部样式表进行样式设置(这就是为什么我在divs.中添加了class属性(

相关内容

最新更新