Php 两种模式的正则表达式

Php 两种模式的正则表达式,php,regex,Php,Regex,我有一个非常大的csv列表,我已经将列表转换为数组,并设法解决了我使用UTF8时遇到的一个问题: $lines = file(''.get_template_directory_uri() . '/lines.csv'); foreach ($lines as $line_num => $line) { if(mb_detect_encoding($line, 'utf-8', false)) { $listL

我有一个非常大的csv列表,我已经将列表转换为数组,并设法解决了我使用UTF8时遇到的一个问题:

 $lines = file(''.get_template_directory_uri() . '/lines.csv');      

        foreach ($lines as $line_num => $line)
    {
        if(mb_detect_encoding($line, 'utf-8', false)) {
            $listLines.=  $line . '<br />';     
         }
    } 
基本上我需要
|
之前的所有内容,输出:

Adolfo_(São_Paulo)

列表中的其他项目没有
|

Abatiá (PR)    
Abel Figueiredo (PA)
São Francisco de Assis do Piauí (PI)
我需要输出:

Abatiá
Abel_Figueiredo
São_Francisco_de_Assis_do_Piauí

我相信我将不得不使用正则表达式,但我对这两种情况下的规则有点困惑。

基于评论。。。这个怎么样:

$lines = file(''.get_template_directory_uri() . '/lines.csv');      

foreach ($lines as $line_num => $line)
{
    if(mb_detect_encoding($line, 'utf-8', false)) {
        $exp = '';
        if(strpos($line, '|')!==FALSE){
            $exp = '/^(.+?)\s*\|/';
        }else{
            $exp = '/^(.+?)\s*\(/';
        }
        preg_match($exp, $line, $matches);
        if($matches){
             $line = $matches[1];
             $line = preg_replace('/\s+/', '_', $line);
             $listLines.=  $line . '<br />';
        }
    }
} 
$lines=file(''.get_template_directory_uri()。/lines.csv');
foreach($line作为$line_num=>$line的行)
{
if(mb_检测_编码($line'utf-8',false)){
$exp='';
if(strpos($line,“|”)!==FALSE){
$exp='/^(+?)\s*\\\\;/';
}否则{
$exp='/^(+?)\s*\(/');
}
预匹配($exp,$line,$matches);
如果($匹配){
$line=$matches[1];
$line=preg_replace('/\s+/','',$line);
$listLines.=$line.“
”; } } }
基于评论……这个怎么样:

$lines = file(''.get_template_directory_uri() . '/lines.csv');      

foreach ($lines as $line_num => $line)
{
    if(mb_detect_encoding($line, 'utf-8', false)) {
        $exp = '';
        if(strpos($line, '|')!==FALSE){
            $exp = '/^(.+?)\s*\|/';
        }else{
            $exp = '/^(.+?)\s*\(/';
        }
        preg_match($exp, $line, $matches);
        if($matches){
             $line = $matches[1];
             $line = preg_replace('/\s+/', '_', $line);
             $listLines.=  $line . '<br />';
        }
    }
} 
$lines=file(''.get_template_directory_uri()。/lines.csv');
foreach($line作为$line_num=>$line的行)
{
if(mb_检测_编码($line'utf-8',false)){
$exp='';
if(strpos($line,“|”)!==FALSE){
$exp='/^(+?)\s*\\\\;/';
}否则{
$exp='/^(+?)\s*\(/');
}
预匹配($exp,$line,$matches);
如果($匹配){
$line=$matches[1];
$line=preg_replace('/\s+/','',$line);
$listLines.=$line.“
”; } } }
检查字符串中是否存在“|”。如果存在,则在条形图上拆分并仅获取第一个子字符串。如果不存在,则在空格上拆分并获取除最后一个子字符串以外的所有子字符串

如果元素属于上述任何一种类型,并且没有第三种类型的字符串,则此操作适用于数据列表。检查字符串中是否存在“|”。如果存在,则在条形图上拆分,仅获取第一个子字符串。如果不存在,则在空格上拆分,并获取除最后一个子字符串以外的所有子字符串


如果元素属于上述任何一种类型,并且没有第三种类型的字符串,那么这应该适用于您的数据列表

谢谢@sinal2013,但这将返回
Adolfoè(圣保罗)| Adolfoè(SP)
Sèoèu Francisco_deèu Assisèu doèPiauè_
我尝试了您的更新,所有类似于
阿道夫(圣保罗)
的通信都正确显示,但类似于
旧金山圣路易斯·德阿西斯·多普
的匹配不会出现在列表上。这只显示具有
文本(文本)的匹配
或类似的,左边或括号内有更多的单词OK…谢谢你让我知道发生了什么。我想我知道发生了什么。但是为了简化事情,可以分两部分来完成吗?如果存在,使用表达式1,其他使用nexte他们很好。谢谢。很高兴你完成了。谢谢@sinal2013,但这是返回的
Adolfo|uu(圣保罗)| Adolfo_(SP)
São Francisco_de_Assis_do_Piauíu(PI)
我尝试了您的更新,所有类似于
Adolfo_(圣保罗)
的通信都正确显示,但类似于
São Francisco_de_Assis_do_íu Piauíu
的匹配不会出现在列表上这只是显示具有
文本的匹配
或类似内容,左边或括号内有更多单词OK…谢谢你让我知道发生了什么。我想我知道发生了什么。但为了简化事情,可以分为两部分来完成。如果存在,请使用表达式1,否则请使用nexte。太好了。谢谢。很高兴你完成了。