Php 正则表达式不返回任何与所用表达式无关的匹配项
好的,问题就在这里,我一直在尝试构建cURL脚本来检查数据库中的死链接。所有链接看起来都像这样Php 正则表达式不返回任何与所用表达式无关的匹配项,php,mysql,regex,pdo,Php,Mysql,Regex,Pdo,好的,问题就在这里,我一直在尝试构建cURL脚本来检查数据库中的死链接。所有链接看起来都像这样http://www.ltblekinge.se/download/18.9c16a31109c04a3e880003750。我遇到的问题是,无论使用什么正则表达式“模式”,我使用的$url\u列表仍然是空的。任何帮助都将不胜感激 代码中有问题的部分 <?php /*Config*/ /*** mysql hostname ***/ $hostname = 'localhost'; /*** m
http://www.ltblekinge.se/download/18.9c16a31109c04a3e880003750
。我遇到的问题是,无论使用什么正则表达式“模式”,我使用的$url\u列表仍然是空的。任何帮助都将不胜感激
代码中有问题的部分
<?php
/*Config*/
/*** mysql hostname ***/
$hostname = 'localhost';
/*** mysql username ***/
$username = 'root';
/*** mysql password ***/
$password = 'root';
/*curl setup of varibles*/
$excluded_domains = array(
'localhost', 'rollnstroll.se');
$max_connections = 10;
$url_list = array();
$working_urls = array();
$dead_urls = array();
$not_found_urls = array();
$active = null;
try {
$dbh = new PDO("mysql:host=$hostname;dbname=blankett", $username, $password);
$dbh->exec('SET CHARACTER SET utf8');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/*** fetch into an PDOStatement object ***/
$sql = "SELECT * FROM `forms2`";
$stmt = $dbh->prepare("SELECT * FROM forms2");
$stmt->execute();
while ($d = $stmt->fetchAll()) {
if (preg_match_all('/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)/', $d['link_forms'], $matches)) {
/***error code***/
if (preg_last_error() == PREG_NO_ERROR) {
print 'There is no error.';
}
else if (preg_last_error() == PREG_INTERNAL_ERROR) {
print 'There is an internal error!';
}
else if (preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR) {
print 'Backtrack limit was exhausted!';
}
else if (preg_last_error() == PREG_RECURSION_LIMIT_ERROR) {
print 'Recursion limit was exhausted!';
}
else if (preg_last_error() == PREG_BAD_UTF8_ERROR) {
print 'Bad UTF8 error!';
}
else if (preg_last_error() == PREG_BAD_UTF8_ERROR) {
print 'Bad UTF8 offset error!';
}
foreach ($matches[1] as $url) {
// exclude some domains
$tmp = parse_url($url);
if (in_array($tmp['host'], $excluded_domains)) {
continue;
}
// store the url
$url_list []= $url;
}
}
}
// remove duplicates
$url_list = array_values(array_unique($url_list));
if (!$url_list) {
die('No URL to check');
}
}
catch(PDOException $e)
{
echo $e->getMessage();
}
1 id int(10) No None AUTO_INCREMENT
2 master_id int(10) No None
3 name_form varchar(500) latin1_swedish_ci No None
4 link_form varchar(500) latin1_swedish_ci No None
5 date_added timestamp No CURRENT_TIMESTAMP
问题
为什么$url\u list
emtpy?这对我很有用:
$url="http://www.ltblekinge.se/download/18.9c16a31109c04a3e880003750 http://one.com www.two.com http://yourad.io";
preg_match_all('/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)/', $url, $matches);
print_r($matches[1]);
输出:
Array
(
[0] => http://www.ltblekinge.se/download/18.9c16a31109c04a3e880003750
[1] => http://one.com
[2] => www.two.com
[3] => http://yourad.io
)
检查您的$d['link\u forms']
var\u dump($matches[1])==?此外-除非您100%了解该regexp,否则请尝试preg\u last\u error()在try single引用regexp时找到regexp,您的$s可能就是它。@StenW最好了解不使用regex的地方。大多数时候,它们根本不需要。此外,如果你想学习,尝试一些简单的方法。这个正则表达式非常复杂。至少对我来说是:-)好吧,我想你在哪里是对的。这是我第一次使用preg_match_all,我对它的工作原理有点困惑。谢谢你,伙计!