preg_split,最后2-3个字符非字母数字

时间:2015-12-02 22:18:11

标签: php regex preg-split

所以我正在研究一些php,并寻求一些常规exp的帮助。

我有一个字符串数组,如下所示:

$variable_with_strings
array(
    [0][art] => >AngusDelu -
    [1][art] => >PatatasJr -
    [2][art] => >AngusHabane *
    [3][art] => >Papas Med *
    [4][art] => >AngusDelu*
    [5][art] => >Papas Med*
    [6][art] => >AngusHabane**
    [7][art] => >Papas Med**
    [8][art] => >Papas Med_*-
    [9][art] => >Manza Med_*-
)

我循环使用每一个,作为单个变量处理($ variable_with_strings

我想将字符串分成两部分,以便以后将它分组

正在寻找带preg_split()的正则表达式的东西: (我需要两部分; 1.-描述项目和2.-组标志)

我期望拥有的每一个:

$word = array
    [art] => >AngusDelu
    [sep] =>  -)

$word = array(
    [art] => >PatatasJr
    [sep] =>  -)

$word = array(
    [art] => >AngusHabane
    [sep] =>  *)

$word = array(
    [art] => >Papas Med
    [sep] =>  *)

$word = array(
    [art] => >AngusDelu
    [sep] => *)

$word = array(
    [art] => >Papas Med
    [sep] => *)

$word = array(
    [art] => >AngusHabane
    [sep] => **)

$word = array(    
    [art] => >Papas Med
    [sep] => **)

$word = array(
    [art] => >Papas Med
    [sep] => _*-)

$word = array(
    [art] => >Manza Med
    [sep] => _*-)
)

所以我使用的是:

$word = preg_split('/[^\w]/',$variable_with_strings);

但这会分裂每个空白区域,

我觉得这有点棘手,因为在第一个字符中始终有>,最后一个字符是*_-或某些字符在这些“”之前计算一个空格,有时候特殊的字符在结尾处有1,2或3个。

可以这样做吗?

感谢

2 个答案:

答案 0 :(得分:0)

我会用

[^a-z]+$

使用preg_replace以及mi修饰符。 (您的示例没有数字;如果您还想要数字,请在字符类中添加\d

Regex101演示:https://regex101.com/r/rX3oK7/2(注意演示中的g修饰符未在PHP中使用,preg_replace已全局化了

PHP用法:

$string = '[art] => >AngusDelu -
[art] => >PatatasJr -
[art] => >AngusHabane *
[art] => >Papas Med *
[art] => >AngusDelu*
[art] => >Papas Med*
[art] => >AngusHabane**
[art] => >Papas Med**
[art] => >Papas Med--
[art] => >Manza Med--';
echo preg_replace('/[^a-z]+$/im', '', $string);

输出:

[art] => >AngusDelu
[art] => >PatatasJr
[art] => >AngusHabane
[art] => >Papas Med
[art] => >AngusDelu
[art] => >Papas Med
[art] => >AngusHabane
[art] => >Papas Med
[art] => >Papas Med
[art] => >Manza Med

PHP演示:https://eval.in/479444

答案 1 :(得分:0)

您可以使用preg_split,仅匹配字符串的结尾,如/(\W+$)/,并将PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE标志作为第四个参数传递,以捕获您在结果中分割的内容。 PREG_SPLIT_DELIM_CAPTURE捕获您要拆分的分隔线,PREG_SPLIT_NO_EMPTY将确保没有空的结果。

示例:

<?php
$art = array(
    '>AngusDelu -',
    '>PatatasJr -',
    '>AngusHabane *',
    '>Papas Med *',
    '>AngusDelu*',
    '>Papas Med*',
    '>AngusHabane**',
    '>Papas Med**',
    '>Papas Med--',
    '>Manza Med--',
    );

foreach($art as $a){
    $split = preg_split('/(\W+$)/', $a, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
    echo '<pre>'.print_r($split,true).'</pre>';
}

演示:http://codepad.viper-7.com/9mCDlc

输出:

Array
(
    [0] => >AngusDelu
    [1] =>  -
)

Array
(
    [0] => >PatatasJr
    [1] =>  -
)

Array
(
    [0] => >AngusHabane
    [1] =>  *
)

Array
(
    [0] => >Papas Med
    [1] =>  *
)

Array
(
    [0] => >AngusDelu
    [1] => *
)

Array
(
    [0] => >Papas Med
    [1] => *
)

Array
(
    [0] => >AngusHabane
    [1] => **
)

Array
(
    [0] => >Papas Med
    [1] => **
)

Array
(
    [0] => >Papas Med
    [1] => --
)

Array
(
    [0] => >Manza Med
    [1] => --
)

每个都在一个单独的数组中,因为你说你有一个数组,所以你需要循环并在数组中的每个条目上运行split。您可以在循环中一次使用一个数组,或者将它们组合成一个数组以便以后使用。