如以下代码所示,我想打印$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=" Check IMDB ">
<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
属性(