php-如果preg_match与模式不匹配,则取消数组设置吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php-如果preg_match与模式不匹配,则取消数组设置吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5325字,纯文字阅读大概需要8分钟。
内容图文
![php-如果preg_match与模式不匹配,则取消数组设置吗?](/upload/InfoBanner/zyjiaocheng/681/4dbebacda9814eb19e41b3a61a70b9cc.jpg)
我有一个多维数组,如下所示:
Array
(
[0] => Array
(
[0] => Title 1
[1] => Some text ... US5801351017 ...
)
[1] => Array
(
[0] => Title 2
[1] => Some text ... US0378331005 ...
)
[2] => Array
(
[0] => Title 3
[1] => Some text ... //Note here that it does not contain an ISIN Code
)
...
我正在尝试过滤出与包含ISIN代码的正则表达式匹配的数组.上面的数组是由以下代码生成的:
$title = $html->find("h3.r a");
$titlearray = array_map(function($value){
return trim($value->plaintext);
}, $title);
$description = $html->find("span.st");
$descriptionarray = array_map(function($value){
$string = strip_tags($value);
return $string;
}, $description);
$result1 = array();
foreach($titlearray as $key => $value) {
$tmp = array($value);
if (isset($descriptionarray[$key])) {
$tmp[] = $descriptionarray[$key];
}
$result1[] = $tmp;
}
print_r($result1);
我已经编写了一些代码,这些代码非常接近,但是并没有真正取消不包含ISIN代码的数组的设置.我的代码是这样的:
$title = $html->find("h3.r a");
$titlearray = array_map(function($value){
return trim($value->plaintext);
}, $title);
$description = $html->find("span.st");
$descriptionarray = array_map(function($value){
$match = array();
$string = strip_tags($value);
$pattern = "/[BE|BM|FR|BG|VE|DK|HR|DE|JP|HU|HK|JO|US|BR|XS|FI|GR|IS|RU|LB|"
. "PT|NO|TW|UA|TR|LK|LV|LU|TH|NL|PK|PH|RO|EG|PL|AA|CH|CN|CL|EE|CA|"
. "IR|IT|ZA|CZ|CY|AR|AU|AT|IN|CS|CR|IE|ID|ES|PE|TN|PA|SG|IL|US|MX|"
. "SK|KRSI|KW|MY|MO|SE|GB|GG|KY|JE|VG|NG|SA|MU]{2}[A-Z0-9]{10}/";
preg_match($pattern, $string, $match);
return $match;
}, $description);
$merged = array();
$i=0;
foreach($descriptionarray as $value){
$merged[$i] = $value;
$merged[$i][] = $titlearray[$i];
$i++;
}
print_r($merged);
这给了我这些数组:
Array
(
[0] => Array
(
[0] => US5801351017
[1] => Title 1
)
[1] => Array
(
[0] => US0378331005
[1] => Title 2
)
[2] => Array
(
[0] => Title 3
)
...
如何摆脱与正则表达式不匹配的数组?我正在寻找的是此输出:
Array
(
[0] => Array
(
[0] => Title 1
[1] => US5801351017
)
[1] => Array
(
[0] => Title 2
[1] => US0378331005
)
...
编辑
@CasimiretHippolyte
根据他的回答,我现在有以下代码:
$titles = $html->find("h3.r a");
$descriptions = $html->find("span.st");
$ISIN_PATTERN = "/[BE|BM|FR|BG|VE|DK|HR|DE|JP|HU|HK|JO|US|BR|XS|FI|GR|IS|RU|LB|"
. "PT|NO|TW|UA|TR|LK|LV|LU|TH|NL|PK|PH|RO|EG|PL|AA|CH|CN|CL|EE|CA|"
. "IR|IT|ZA|CZ|CY|AR|AU|AT|IN|CS|CR|IE|ID|ES|PE|TN|PA|SG|IL|US|MX|"
. "SK|KRSI|KW|MY|MO|SE|GB|GG|KY|JE|VG|NG|SA|MU]{2}[A-Z0-9]{10}/";
$results = [];
foreach ($descriptions as $k => $v) {
if (preg_match($ISIN_PATTERN, strip_tags($v), $m)) {
$results[] = ['Title' => trim($titles[$k]->plaintext), 'ISIN' => $m[1]];
}
}
print_r($results);
这缩小了我的数组的范围,仅选择与正则表达式匹配的元素,但未在“ ISIN” =>下显示匹配项. $m [1].它输出:
Array
(
[0] => Array
(
[Title] => Title 1
[ISIN] =>
)
[1] => Array
(
[Title] => Title 2
[ISIN] =>
)
...
进一步编辑
这段代码解决了这个问题:
$titles = $html->find("h3.r a");
$descriptions = $html->find("span.st");
$ISIN_PATTERN = "/[BE|BM|FR|BG|VE|DK|HR|DE|JP|HU|HK|JO|US|BR|XS|FI|GR|IS|RU|LB|"
. "PT|NO|TW|UA|TR|LK|LV|LU|TH|NL|PK|PH|RO|EG|PL|AA|CH|CN|CL|EE|CA|"
. "IR|IT|ZA|CZ|CY|AR|AU|AT|IN|CS|CR|IE|ID|ES|PE|TN|PA|SG|IL|US|MX|"
. "SK|KRSI|KW|MY|MO|SE|GB|GG|KY|JE|VG|NG|SA|MU]{2}[A-Z0-9]{10}/";
$results1 = [];
foreach ($descriptions as $k => $v) {
if (preg_match($ISIN_PATTERN, strip_tags($v), $m)) {
$results1[] = ['Title' => trim($titles[$k]->plaintext), 'ISIN' => $m[1]];
}
}
$titlesarray = array_column($results1, 'Title');
$results2 = array_map(function($value){
$match = array();
$string = strip_tags($value);
$pattern = "/[BE|BM|FR|BG|VE|DK|HR|DE|JP|HU|HK|JO|US|BR|XS|FI|GR|IS|RU|LB|"
. "PT|NO|TW|UA|TR|LK|LV|LU|TH|NL|PK|PH|RO|EG|PL|AA|CH|CN|CL|EE|CA|"
. "IR|IT|ZA|CZ|CY|AR|AU|AT|IN|CS|CR|IE|ID|ES|PE|TN|PA|SG|IL|US|MX|"
. "SK|KRSI|KW|MY|MO|SE|GB|GG|KY|JE|VG|NG|SA|MU]{2}[A-Z0-9]{10}/";
preg_match($pattern, $string, $match);
return $match;
}, $descriptions);
$descriptionarray = array_column($results2, 0);
$result3 = array();
foreach($titlesarray as $key => $value) {
$tmp = array($value);
if (isset($descriptionarray[$key])) {
$tmp[] = $descriptionarray[$key];
}
$result3[] = $tmp;
}
print_r($result3);
我需要快速解决方案,因此很快就将某些内容整理到一起.鉴于我使用了额外的arrar_map(),将数组简化为一个简单数组,然后将它们重新结合在一起,因此效率非常低下.除此之外,我重复我的正则表达式.
最后编辑
@CasimiretHippolyte答案是最有效的解决方案,它给出了将他的模式与$m [1]或我的模式与$m [0]一起使用的答案.
解决方法:
您可以使用简单的foreach另一种方式设计代码,并仅在找到ISIN代码时一个接一个地构建结果项:
$titles = $html->find("h3.r a");
$descriptions = $html->find("span.st");
define ('ISIN_PATTERN', '~
\b # there is probably a word boundary at the begin of the ISIN code
(?=([A-Z]{2}[A-Z0-9]{10})\b) # check the format before testing the whole alternation
# at the same time, the ISIN is captured in group 1
(?: # so, this alternation is only here to make the pattern fail or succeed
C[AHLNRSYZ]|I[DELNRST]|P[AEHKLT]|S[AEIGK]|A[ARTU]|B[EGMR]|L[BKUV]|M[OUXY]|T[HNRW]
|E[EGS]|G[BGR]|H[KRU]|J[EOP]|K[RWY]|N[GLO]|D[EK]|F[IR]|R[OU]|U[AS]|V[EG]|XS|ZA
)~x');
$results = [];
foreach ($descriptions as $k => $v) {
if (preg_match(ISIN_PATTERN, strip_tags($v), $m))
$results[] = [ 'ISIN' => $m[1], 'Title' => trim($titles[$k]->plaintext) ];
}
print_r($results);
注意:此代码未经测试,可能需要改进.几个想法:
>停止使用simplehtml并使用DOMDocument和DOMXPath
>手动模式的设计假设所有国家都是平等的.如果不是这种情况,请将其重写以优先检查最新的国家/地区
内容总结
以上是互联网集市为您收集整理的php-如果preg_match与模式不匹配,则取消数组设置吗?全部内容,希望文章能够帮你解决php-如果preg_match与模式不匹配,则取消数组设置吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。