【问题标题】:Another kind of str_replace() (more strict)另一种 str_replace() (更严格)
【发布时间】:2018-06-20 17:37:07
【问题描述】:

***更新:谢谢大家的所有回答!感谢您的回复,我找到了解决问题的另一种方法!


        $find = array('ACH', 'AER', 'AERG', 'AGL', 'AIRE', 'ALL', 'ANGL', 'ARC', 'ART', 'AUT', 'AV', 'BASE', 'BD', 'BER', 'BORD', 'BRE', 'BRG', 'BRTL', 'BSN', 'CAE','CALL', 'CAMI', 'CAMP', 'CAN', 'CAR', 'CARE', 'CASR', 'CC', 'CD', 'CF', 'CHA', 'CHE', 'CHEM', 'CHL', 'CHP', 'CHS', 'CHT', 'CHV', 'CITE', 'CIVE','CLOS', 'CLR', 'COIN', 'COL', 'COR', 'CORO', 'COTE', 'COUR', 'CPG', 'CR', 'CRS', 'CRX','CTR', 'CTRE', 'DARS', 'DEVI', 'DIG', 'DOM', 'DRA', 'DSC', 'ECA', 'ECL', 'EMBR', 'EMP', 'ENC', 'ENV', 'ESC', 'ESP', 'ESPA', 'ETNG', 'FD', 'FG','FON', 'FOR', 'FORT', 'FOS', 'FRM', 'GAL', 'GARE', 'GBD', 'GPL', 'GR', 'GREV', 'HAB', 'HAM', 'HIP', 'HLE', 'HLG', 'HLM', 'HTR', 'ILE', 'ILOT', 'IMP', 'JARD', 'JTE', 'LAC', 'LEVE','LICE', 'LIGN', 'LOT', 'MAIL', 'MAIS', 'MAR', 'MARE', 'MAS', 'MNE', 'MRN', 'MTE', 'NTE', 'PAE', 'PARC', 'PAS', 'PASS', 'PCH', 'PCHE', 'PHAR', 'PIST','PKG', 'PL', 'PLA', 'PLAG', 'PLAN', 'PLCI', 'PLE', 'PLN', 'PLT', 'PNT', 'PONT', 'PORQ', 'PORT', 'POST', 'POT', 'PROM', 'PRT', 'PRV', 'PTA', 'PTE', 'PTR', 'PTTE', 'QUA', 'QUAI', 'RAC', 'REM', 'RES','RIVE', 'RLE', 'ROC', 'RPE', 'RPT', 'RTD', 'RTE', 'RUE', 'RUET', 'RUIS', 'RULT', 'RVE', 'SAS', 'SEN', 'SQ', 'STDE', 'TER', 'TOUR', 'TPL', 'TRA','TRAB', 'TRN', 'TRT', 'TSSE', 'TUN', 'VAL', 'VALL', 'VC', 'VCHE', 'VEN', 'VGE', 'VIA','VIAD', 'VIL', 'VLA', 'VOIE', 'VOIR', 'VOUT', 'VOY', 'VTE', 'ZA', 'ZAC', 'ZAD', 'ZI', 'ZONE', 'ZUP');

    $replace = array('ANCIEN CHEMIN', 'AERODROME', 'AEROGARE', 'AGGLOMERATION', 'AIRE', 'ALLEE', 'ANGLE', 'ARCADE', 'ANCIENNE ROUTE', 'AUTOROUTE', 'AVENUE', 'BASE', 'BOULEVARD', 'BERGE', 'BORD', 'BARRIERE', 'BOURG', 'BRETELLE', 'BASSIN', 'CARRIERA', 'CALLE, CALLADA', 'CAMIN', 'CAMP', 'CANAL', 'CARREFOUR', 'CARRIERE', 'CASERNE', 'CHEMIN COMMUNAL', 'CHEMIN DEPARTEMENTAL', 'CHEMIN FORESTIER', 'CHASSE', 'CHEMIN', 'CHEMINEMENT', 'CHALET', 'CHAMP', 'CHAUSSEE', 'CHATEAU', 'CHEMIN VICINAL', 'CITE', 'COURSIVE','CLOS', 'COULOIR', 'COIN', 'COL', 'CORNICHE', 'CORON', 'COTE', 'COUR', 'CAMPING', 'CHEMIN RURAL', 'COURS', 'CROIX','CONTOUR', 'CENTRE', 'DARSE, DARCE', 'DEVIATION', 'DIGUE', 'DOMAINE', 'DRAILLE', 'DESCENTE', 'ECART', 'ECLUSE', 'EMBRANCHEMENT', 'EMPLACEMENT', 'ENCLOS', 'ENCLAVE', 'ESCALIER', 'ESPLANADE', 'ESPACE', 'ETANG', 'FOND', 'FAUBOURG','FONTAINE', 'FORET', 'FORT', 'FOSSE', 'FERME', 'GALERIE', 'GARE', 'GRAND BOULEVARD', 'GRANDE PLACE', 'GRANDE RUE', 'GREVE', 'HABITATION', 'HAMEAU', 'HIPPODROME', 'HALLE', 'HALAGE', 'HLM', 'HAUTEUR', 'ILE', 'ILOT', 'IMPASSE', 'JARDIN', 'JETEE', 'LAC', 'LEVEE', 'LICES','LIGNE', 'LOTISSEMENT', 'MAIL', 'MAISON', 'MARCHE', 'MARE', 'MAS', 'MORNE', 'MARINA', 'MONTEE', 'NOUVELLE ROUTE', 'PETITE AVENUE', 'PARC', 'PASSAGE', 'PASSE', 'PETIT CHEMIN', 'PORCHE', 'PHARE', 'PISTE', 'PARKING','PLACE', 'PLACA', 'PLAGE', 'PLAN', 'PLACIS', 'PASSERELLE', 'PLAINE', 'PLATEAU', 'POINTE', 'PONT', 'PORTIQUE', 'PORT', 'POSTE', 'POTERNE', 'PROMENADE', 'PETITE ROUTE', 'PARVIS', 'PETITE ALLEE', 'PORTE', 'PETITE RUE', 'PLACETTE', 'QUARTIER', 'QUAI', 'RACCOURCI', 'REMPART', 'RESIDENCE','RIVE', 'RUELLE', 'ROCADE', 'RAMPE', 'ROND-POINT', 'ROTONDE', 'ROUTE', 'RUE', 'RUETTE', 'RUISSEAU', 'RUELLETTE', 'RAVINE', 'SAS', 'SENTIER, SENTE', 'SQUARE', 'STADE', 'TERRE', 'TOUR', 'TERRE-PLEIN', 'TRAVERSE','TRABOULE', 'TERRAIN', 'TERTRE', 'TERRASSE', 'TUNNEL', 'VAL', 'VALLON, VALLEE', 'VOIE COMMUNALE', 'VIEUX CHEMIN', 'VENELLE', 'VILLAGE', 'VIA','VIADUC', 'VILLE', 'VILLA', 'VOIE', 'VOIRIE', 'VOUTE', 'VOYEUL', 'VIEILLE ROUTE', 'ZA', 'ZAC', 'ZAD', 'ZI', 'ZONE', 'ZUP');

    $arr = array_combine($find, $replace);

    foreach ($resultat as $enreg) { // extrait chaque ligne une à une
        echo $arr[$enreg['nature']];
    }

祝大家有个愉快的一天;)


在我的代码中,我需要用实际术语替换 Abbreviations。

我目前使用带有数组的 str_replace 来查找要随实词更改的缩写,这是我的代码:

        foreach ($resultat as $enreg) {
        $enreg['nature'] = str_replace(
            array('ACH', 'AER', 'AERG', 'AGL', 'AIRE', 'ALL', 'ANGL', 'ARC', 'ART', 'AUT', 'AV', 'BASE', 'BD', 'BER', 'BORD', 'BRE', 'BRG', 'BRTL', 'BSN', 'CAE','CALL', 'CAMI', 'CAMP', 'CAN', 'CAR', 'CARE', 'CASR', 'CC', 'CD', 'CF', 'CHA', 'CHE', 'CHEM', 'CHL', 'CHP', 'CHS', 'CHT', 'CHV', 'CITE', 'CIVE','CLOS', 'CLR', 'COIN', 'COL', 'COR', 'CORO', 'COTE', 'COUR', 'CPG', 'CR', 'CRS', 'CRX','CTR', 'CTRE', 'DARS', 'DEVI', 'DIG', 'DOM', 'DRA', 'DSC', 'ECA', 'ECL', 'EMBR', 'EMP', 'ENC', 'ENV', 'ESC', 'ESP', 'ESPA', 'ETNG', 'FD', 'FG','FON', 'FOR', 'FORT', 'FOS', 'FRM', 'GAL', 'GARE', 'GBD', 'GPL', 'GR', 'GREV', 'HAB', 'HAM', 'HIP', 'HLE', 'HLG', 'HLM', 'HTR', 'ILE', 'ILOT', 'IMP', 'JARD', 'JTE', 'LAC', 'LEVE','LICE', 'LIGN', 'LOT', 'MAIL', 'MAIS', 'MAR', 'MARE', 'MAS', 'MNE', 'MRN', 'MTE', 'NTE', 'PAE', 'PARC', 'PAS', 'PASS', 'PCH', 'PCHE', 'PHAR', 'PIST','PKG', 'PL', 'PLA', 'PLAG', 'PLAN', 'PLCI', 'PLE', 'PLN', 'PLT', 'PNT', 'PONT', 'PORQ', 'PORT', 'POST', 'POT', 'PROM', 'PRT', 'PRV', 'PTA', 'PTE', 'PTR', 'PTTE', 'QUA', 'QUAI', 'RAC', 'REM', 'RES','RIVE', 'RLE', 'ROC', 'RPE', 'RPT', 'RTD', 'RTE', 'RUE', 'RUET', 'RUIS', 'RULT', 'RVE', 'SAS', 'SEN', 'SQ', 'STDE', 'TER', 'TOUR', 'TPL', 'TRA','TRAB', 'TRN', 'TRT', 'TSSE', 'TUN', 'VAL', 'VALL', 'VC', 'VCHE', 'VEN', 'VGE', 'VIA','VIAD', 'VIL', 'VLA', 'VOIE', 'VOIR', 'VOUT', 'VOY', 'VTE', 'ZA', 'ZAC', 'ZAD', 'ZI', 'ZONE', 'ZUP'),
            array('ANCIEN CHEMIN', 'AERODROME', 'AEROGARE', 'AGGLOMERATION', 'AIRE', 'ALLEE', 'ANGLE', 'ARCADE', 'ANCIENNE ROUTE', 'AUTOROUTE', 'AVENUE', 'BASE', 'BOULEVARD', 'BERGE', 'BORD', 'BARRIERE', 'BOURG', 'BRETELLE', 'BASSIN', 'CARRIERA', 'CALLE, CALLADA', 'CAMIN', 'CAMP', 'CANAL', 'CARREFOUR', 'CARRIERE', 'CASERNE', 'CHEMIN COMMUNAL', 'CHEMIN DEPARTEMENTAL', 'CHEMIN FORESTIER', 'CHASSE', 'CHEMIN', 'CHEMINEMENT', 'CHALET', 'CHAMP', 'CHAUSSEE', 'CHATEAU', 'CHEMIN VICINAL', 'CITE', 'COURSIVE','CLOS', 'COULOIR', 'COIN', 'COL', 'CORNICHE', 'CORON', 'COTE', 'COUR', 'CAMPING', 'CHEMIN RURAL', 'COURS', 'CROIX','CONTOUR', 'CENTRE', 'DARSE, DARCE', 'DEVIATION', 'DIGUE', 'DOMAINE', 'DRAILLE', 'DESCENTE', 'ECART', 'ECLUSE', 'EMBRANCHEMENT', 'EMPLACEMENT', 'ENCLOS', 'ENCLAVE', 'ESCALIER', 'ESPLANADE', 'ESPACE', 'ETANG', 'FOND', 'FAUBOURG','FONTAINE', 'FORET', 'FORT', 'FOSSE', 'FERME', 'GALERIE', 'GARE', 'GRAND BOULEVARD', 'GRANDE PLACE', 'GRANDE RUE', 'GREVE', 'HABITATION', 'HAMEAU', 'HIPPODROME', 'HALLE', 'HALAGE', 'HLM', 'HAUTEUR', 'ILE', 'ILOT', 'IMPASSE', 'JARDIN', 'JETEE', 'LAC', 'LEVEE', 'LICES','LIGNE', 'LOTISSEMENT', 'MAIL', 'MAISON', 'MARCHE', 'MARE', 'MAS', 'MORNE', 'MARINA', 'MONTEE', 'NOUVELLE ROUTE', 'PETITE AVENUE', 'PARC', 'PASSAGE', 'PASSE', 'PETIT CHEMIN', 'PORCHE', 'PHARE', 'PISTE', 'PARKING','PLACE', 'PLACA', 'PLAGE', 'PLAN', 'PLACIS', 'PASSERELLE', 'PLAINE', 'PLATEAU', 'POINTE', 'PONT', 'PORTIQUE', 'PORT', 'POSTE', 'POTERNE', 'PROMENADE', 'PETITE ROUTE', 'PARVIS', 'PETITE ALLEE', 'PORTE', 'PETITE RUE', 'PLACETTE', 'QUARTIER', 'QUAI', 'RACCOURCI', 'REMPART', 'RESIDENCE','RIVE', 'RUELLE', 'ROCADE', 'RAMPE', 'ROND-POINT', 'ROTONDE', 'ROUTE', 'RUE', 'RUETTE', 'RUISSEAU', 'RUELLETTE', 'RAVINE', 'SAS', 'SENTIER, SENTE', 'SQUARE', 'STADE', 'TERRE', 'TOUR', 'TERRE-PLEIN', 'TRAVERSE','TRABOULE', 'TERRAIN', 'TERTRE', 'TERRASSE', 'TUNNEL', 'VAL', 'VALLON, VALLEE', 'VOIE COMMUNALE', 'VIEUX CHEMIN', 'VENELLE', 'VILLAGE', 'VIA','VIADUC', 'VILLE', 'VILLA', 'VOIE', 'VOIRIE', 'VOUTE', 'VOYEUL', 'VIEILLE ROUTE', 'ZA', 'ZAC', 'ZAD', 'ZI', 'ZONE', 'ZUP'),
            $enreg['nature']
        );
        echo $enreg['nature'];        };

这里的问题是 str_replace 对缩写“PL”不够严格,因为它将被替换为“PLACE”和“PLACA”,因为“PL”也在“PLA”缩写中......

我怎样才能创建一个 str_replace,它只会用更严格的研究替换缩写(例如,用“PL”代替“PLACE”而不是“PLACACE”,因为“PL”也在“PLA”缩写中)?

【问题讨论】:

标签: php preg-replace str-replace


【解决方案1】:

您可以从缩写值中创建一个基于替代的正则表达式,并使用单词边界仅将它们作为整个单词在文本中匹配,并使用preg_replace_callback,您可以将每个匹配项替换为相应的替换值。如果您创建一个数组,其中您的缩写将是键并且替换将是值(为此目的使用array_combine),将会更方便。

建议的解决方案可能如下所示

$find = array('ACH', 'AER', 'AERG', 'AGL', 'AIRE', 'ALL', 'ANGL', 'ARC', 'ART', 'AUT', 'AV', 'BASE', 'BD', 'BER', 'BORD', 'BRE', 'BRG', 'BRTL', 'BSN', 'CAE','CALL', 'CAMI', 'CAMP', 'CAN', 'CAR', 'CARE', 'CASR', 'CC', 'CD', 'CF', 'CHA', 'CHE', 'CHEM', 'CHL', 'CHP', 'CHS', 'CHT', 'CHV', 'CITE', 'CIVE','CLOS', 'CLR', 'COIN', 'COL', 'COR', 'CORO', 'COTE', 'COUR', 'CPG', 'CR', 'CRS', 'CRX','CTR', 'CTRE', 'DARS', 'DEVI', 'DIG', 'DOM', 'DRA', 'DSC', 'ECA', 'ECL', 'EMBR', 'EMP', 'ENC', 'ENV', 'ESC', 'ESP', 'ESPA', 'ETNG', 'FD', 'FG','FON', 'FOR', 'FORT', 'FOS', 'FRM', 'GAL', 'GARE', 'GBD', 'GPL', 'GR', 'GREV', 'HAB', 'HAM', 'HIP', 'HLE', 'HLG', 'HLM', 'HTR', 'ILE', 'ILOT', 'IMP', 'JARD', 'JTE', 'LAC', 'LEVE','LICE', 'LIGN', 'LOT', 'MAIL', 'MAIS', 'MAR', 'MARE', 'MAS', 'MNE', 'MRN', 'MTE', 'NTE', 'PAE', 'PARC', 'PAS', 'PASS', 'PCH', 'PCHE', 'PHAR', 'PIST','PKG', 'PL', 'PLA', 'PLAG', 'PLAN', 'PLCI', 'PLE', 'PLN', 'PLT', 'PNT', 'PONT', 'PORQ', 'PORT', 'POST', 'POT', 'PROM', 'PRT', 'PRV', 'PTA', 'PTE', 'PTR', 'PTTE', 'QUA', 'QUAI', 'RAC', 'REM', 'RES','RIVE', 'RLE', 'ROC', 'RPE', 'RPT', 'RTD', 'RTE', 'RUE', 'RUET', 'RUIS', 'RULT', 'RVE', 'SAS', 'SEN', 'SQ', 'STDE', 'TER', 'TOUR', 'TPL', 'TRA','TRAB', 'TRN', 'TRT', 'TSSE', 'TUN', 'VAL', 'VALL', 'VC', 'VCHE', 'VEN', 'VGE', 'VIA','VIAD', 'VIL', 'VLA', 'VOIE', 'VOIR', 'VOUT', 'VOY', 'VTE', 'ZA', 'ZAC', 'ZAD', 'ZI', 'ZONE', 'ZUP');
$replace = array('ANCIEN CHEMIN', 'AERODROME', 'AEROGARE', 'AGGLOMERATION', 'AIRE', 'ALLEE', 'ANGLE', 'ARCADE', 'ANCIENNE ROUTE', 'AUTOROUTE', 'AVENUE', 'BASE', 'BOULEVARD', 'BERGE', 'BORD', 'BARRIERE', 'BOURG', 'BRETELLE', 'BASSIN', 'CARRIERA', 'CALLE, CALLADA', 'CAMIN', 'CAMP', 'CANAL', 'CARREFOUR', 'CARRIERE', 'CASERNE', 'CHEMIN COMMUNAL', 'CHEMIN DEPARTEMENTAL', 'CHEMIN FORESTIER', 'CHASSE', 'CHEMIN', 'CHEMINEMENT', 'CHALET', 'CHAMP', 'CHAUSSEE', 'CHATEAU', 'CHEMIN VICINAL', 'CITE', 'COURSIVE','CLOS', 'COULOIR', 'COIN', 'COL', 'CORNICHE', 'CORON', 'COTE', 'COUR', 'CAMPING', 'CHEMIN RURAL', 'COURS', 'CROIX','CONTOUR', 'CENTRE', 'DARSE, DARCE', 'DEVIATION', 'DIGUE', 'DOMAINE', 'DRAILLE', 'DESCENTE', 'ECART', 'ECLUSE', 'EMBRANCHEMENT', 'EMPLACEMENT', 'ENCLOS', 'ENCLAVE', 'ESCALIER', 'ESPLANADE', 'ESPACE', 'ETANG', 'FOND', 'FAUBOURG','FONTAINE', 'FORET', 'FORT', 'FOSSE', 'FERME', 'GALERIE', 'GARE', 'GRAND BOULEVARD', 'GRANDE PLACE', 'GRANDE RUE', 'GREVE', 'HABITATION', 'HAMEAU', 'HIPPODROME', 'HALLE', 'HALAGE', 'HLM', 'HAUTEUR', 'ILE', 'ILOT', 'IMPASSE', 'JARDIN', 'JETEE', 'LAC', 'LEVEE', 'LICES','LIGNE', 'LOTISSEMENT', 'MAIL', 'MAISON', 'MARCHE', 'MARE', 'MAS', 'MORNE', 'MARINA', 'MONTEE', 'NOUVELLE ROUTE', 'PETITE AVENUE', 'PARC', 'PASSAGE', 'PASSE', 'PETIT CHEMIN', 'PORCHE', 'PHARE', 'PISTE', 'PARKING','PLACE', 'PLACA', 'PLAGE', 'PLAN', 'PLACIS', 'PASSERELLE', 'PLAINE', 'PLATEAU', 'POINTE', 'PONT', 'PORTIQUE', 'PORT', 'POSTE', 'POTERNE', 'PROMENADE', 'PETITE ROUTE', 'PARVIS', 'PETITE ALLEE', 'PORTE', 'PETITE RUE', 'PLACETTE', 'QUARTIER', 'QUAI', 'RACCOURCI', 'REMPART', 'RESIDENCE','RIVE', 'RUELLE', 'ROCADE', 'RAMPE', 'ROND-POINT', 'ROTONDE', 'ROUTE', 'RUE', 'RUETTE', 'RUISSEAU', 'RUELLETTE', 'RAVINE', 'SAS', 'SENTIER, SENTE', 'SQUARE', 'STADE', 'TERRE', 'TOUR', 'TERRE-PLEIN', 'TRAVERSE','TRABOULE', 'TERRAIN', 'TERTRE', 'TERRASSE', 'TUNNEL', 'VAL', 'VALLON, VALLEE', 'VOIE COMMUNALE', 'VIEUX CHEMIN', 'VENELLE', 'VILLAGE', 'VIA','VIADUC', 'VILLE', 'VILLA', 'VOIE', 'VOIRIE', 'VOUTE', 'VOYEUL', 'VIEILLE ROUTE', 'ZA', 'ZAC', 'ZAD', 'ZI', 'ZONE', 'ZUP');
$arr = array_combine($find, $replace);
$enreg = "Some PL here";
echo preg_replace_callback('/\b(?:'.implode("|", $find) . ')\b/', function($m) use ($arr) {
    return $arr[$m[0]];
}, $enreg);

请参阅PHP demo

'\b(?:'.implode("|", $find) . ')\b' 将产生类似\b(?:ACH|AER|AERG|PL|PLA|etc)\b 的模式,并且只会将替代项作为整个单词进行匹配。

请注意,此解决方案假定缩写仅由字母(单词字符)组成,并且您的缩写列表不会太大而无法容纳单个正则表达式模式。否则,您可以使用更通用的模式,例如 '/\b[A-Z]+\b/',在回调函数中,您需要检查数组是否包含找到的键(例如,使用 isset($arr[$m[0]])。

【讨论】:

    【解决方案2】:

    您可以使用 key => value 数组来执行此操作。只需使用缩写作为您的键,并使用完整的单词作为值。像这样:

    foreach($resultstat as $enreg) {
        $dictionary = [
          'ACH' => 'ANCIEN CHEMIN',
          'AER' => 'AERODROME'
          // and so on
        ];
        echo $dictionary[$enreg];
    }
    

    【讨论】:

    • 声明循环内的查找,嗯?我不这么认为。
    • 你的文字说你可以使用 key => value 但你的代码根本没有提到 key。并且不确定这将如何解决 OPs 问题
    猜你喜欢
    • 2012-06-27
    • 2013-03-14
    • 2013-10-22
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多