我在匹配正则表达式中的可选模式组时遇到问题.元字符*和+是贪婪的,所以我认为元字符?也会贪婪,但似乎没有像我想象的那样发挥作用.
理论上我假设如果我们选择使模式组可选,如果在字符串中找到模式组,它将在匹配结果中返回,如果找不到,我们仍然会获得整体匹配结果,但是匹配在结果中丢失.
实际发生的是,如果我的模式在字符串中匹配,它不包含在匹配结果中,正则表达式似乎注意到模式组是可选的,并且只是不打算甚至尝试匹配它.
如果我们设置测试并将此可选模式组更改为非可选模式,则regex会将其包含在匹配结果中,但这仅适用于测试,因为有时此模式在字符串中不可用.
我需要在结果中包含匹配的原因是因为我需要匹配结果以便在以后进行分析.
Encase我没有很好地描述这个场景,我已经设置了一个非常简单的例子,在PHP中.
$string = 'This is a test, Stackoverflow. 2014 Cecili0n';
if(preg_match_all("~(This).*?(Stackoverflow)?~i",$string,$match))
print_r($match);
Run Code Online (Sandbox Code Playgroud)
结果
Array
(
[0] => Array
(
[0] => This
)
[1] => Array
(
[0] => This
)
[2] => Array
(
[0] =>
)
)
Run Code Online (Sandbox Code Playgroud)
(堆栈溢出)?是可选模式,如果我们运行上面的代码,即使该模式在字符串中可用,它也不会在匹配结果中返回.
如果我们强制使用此模式组,它将在结果中返回,如下所示.
if(preg_match_all("~(This).*?(Stackoverflow)~i",$string,$match))
print_r($match);
Run Code Online (Sandbox Code Playgroud)
结果
Array
(
[0] => Array
(
[0] => This
)
[1] => Array
(
[0] => This
)
[2] => Array
(
[0] => Stackoverflow
)
) …Run Code Online (Sandbox Code Playgroud) 如果字符串存在但不是在另一个字符串之前,我似乎无法找到一种不返回匹配的方法.
如果字符串紧跟在另一个字符串之前,我将无法返回匹配项,具有以下内容.
$string = 'Stackoverflow hello world foobar test php';
$regex = "~(Stackoverflow).*?(?<!(test\s))(php)~i";
if(preg_match_all($regex,$string,$match))
print_r($match);
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我们想要返回一个匹配,如果我们有单词Stackoverflow和php,但只有在单词php之前不存在单词test(带空格字符).
这不会返回任何好的结果.
让我们现在说我想匹配php但只有在Stackoverflow和php之间的某个地方不存在foobar这个词时,我假设我可以做以下事情.
$string = 'Stackoverflow hello world foobar test php';
$regex = "~(Stackoverflow).*?(?<!(foobar)).*?(php)~i";
if(preg_match_all($regex,$string,$match))
print_r($match);
Run Code Online (Sandbox Code Playgroud)
(我已将字符串背后的负面效果更改为(foobar),并添加.*?之后)
我还想说,我不能总是知道foobar和php之间会有什么词,有时候会有,有时候200,但我确实有一些定位信息(在Stackoverflow之后和php之前).
当我对10个URL进行检查时,如果我能够与主机服务器建立连接,则句柄将返回成功消息(CURLE_OK)
当服务器拒绝连接时处理每个句柄时,句柄将包含错误消息.
问题
我假设当我们得到一个坏句柄时,CURL将标记此句柄但继续处理未处理的句柄,但这似乎不会发生.当我们遇到错误的句柄时,CURL会将此句柄标记为错误,但不会处理剩余的未处理句柄.
这可能很难检测,如果我确实得到了所有句柄的连接,这是大多数时间发生的事情,那么问题就不可见了.(CURL只在第一次错误连接时停止);
对于测试,我必须找到一个合适的站点,加载缓慢/拒绝x量同时连接.
set_time_limit(0);
$l = array(
'http://smotri.com/video/list/',
'http://smotri.com/video/list/sports/',
'http://smotri.com/video/list/animals/',
'http://smotri.com/video/list/travel/',
'http://smotri.com/video/list/hobby/',
'http://smotri.com/video/list/gaming/',
'http://smotri.com/video/list/mult/',
'http://smotri.com/video/list/erotic/',
'http://smotri.com/video/list/auto/',
'http://smotri.com/video/list/humour/',
'http://smotri.com/video/list/film/'
);
$mh = curl_multi_init();
$s = 0;
$f = 10;
while($s <= $f)
{
$ch = curl_init();
$curlsettings = array(
CURLOPT_URL => $l[$s],
CURLOPT_TIMEOUT => 0,
CURLOPT_CONNECTTIMEOUT => 0,
CURLOPT_RETURNTRANSFER => 1
);
curl_setopt_array($ch, $curlsettings);
curl_multi_add_handle($mh,$ch);
$s++;
}
$active = null;
do
{
curl_multi_exec($mh,$active);
curl_multi_select($mh);
$info = curl_multi_info_read($mh);
echo '<pre>';
var_dump($info);
if($info['result'] === CURLE_OK)
echo curl_getinfo($info['handle'],CURLINFO_EFFECTIVE_URL) . ' success<br>'; …Run Code Online (Sandbox Code Playgroud) 您可以在PDO中运行查询而无需准备它们吗?我知道可能出现的SQL注入问题,但我在测试环境中.
我希望能够编写纯MySQL查询并执行它们,而不必准备查询,绑定占位符等...
我希望能够立即执行如下查询.
INSERT INTO table (table_id, car, bike, date) VALUES (1, 'bmw', 'suzuki', 2004)
Run Code Online (Sandbox Code Playgroud)
我似乎直接在此查询上运行execute()时遇到错误.
提前致谢.
我是 JavaScript 的新手,我在使用数组时遇到了麻烦,我希望我的数组按照我明确编写它的方式进行排序,而不是 JavaScript 决定它想要它的方式。
如果我们有一个数组
var array = {
0: 'zero',
4: 'four',
2: 'two'
};
Run Code Online (Sandbox Code Playgroud)
当我选择在控制台中显示它或对其进行迭代时,它会像这样重新排序
array = {
0: 'zero',
2: 'two',
4: 'four'
};
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试了 2 个循环,for 循环,以及带有 in 语句的 for 循环。两者都按照我假设的方式工作,因为他们使用密钥并向上/向下工作,因此我指定的顺序绝对没用。
我如何按顺序编写/打印/使用我的数组,在其他语言(如 PHP)中,它就像
$array = array(
0 => 'zero',
4 => 'four',
2 => 'two'
);
foreach($array as $key => $value)
echo $key ."\n";
Run Code Online (Sandbox Code Playgroud)
这将输出
0
4
2
Run Code Online (Sandbox Code Playgroud)
提前致谢。