首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将"Port O‘’Brian“替换为"Port O‘’Brian”?

如何将"Port O‘’Brian“替换为"Port O‘’Brian”?
EN

Stack Overflow用户
提问于 2012-12-27 03:46:46
回答 3查看 184关注 0票数 2

我是字符串操作的新手,只是尝试替换列表中的值。

我尝试修复的两个输入是MCAFEEPORT O'BRIAN

所以我运行ucwords(strtolower($rawTitle))。但是现在我有了McafeePort O'brian,当我需要展示McAfeePort O'Brian的时候。

首先关注Port O'brian,这是我的尝试,但显然它不起作用,因为它将字符串的第三个字母大写,而不是我希望的第三个匹配字符:(

代码语言:javascript
复制
$oPattern = "/O\'[a-z]/"; //Pattern to match
$doesMatch = preg_match($oPattern, $output, $matches); //Do I need to the perform operation?
if ($doesMatch == 1) {
    $letters = str_split($output);//break it out into an array
    $cappedLetter = strtoupper($letters[2]);//capitalize the 3rd letter
    $output = preg_replace("/O'$letters[2]/", $output, "O'$cappedLetter");//replace the O'x with O'X
    return $output;
}

这里有没有我应该使用的不同的函数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-27 03:52:51

不,如果套管信息不在管柱中,就没有通用的方法来做到这一点。(例如,考虑姓氏O‘’hara/O‘’hara的两个可能的大写字母。)你可以尽你所能去尝试:

代码语言:javascript
复制
$title = ucwords(strtolower($rawTitle));
$title = preg_replace_callback('/(?<=O\'|Mc)./', function($match) {
    return strtoupper($match[0]);
}, $title);

但一定要在事后手动检查它们。

票数 2
EN

Stack Overflow用户

发布于 2012-12-27 04:24:25

大写名称的规则可能非常复杂。这是我如何处理这些问题的教学例子。请参阅http://www.laprbass.com/RAY_capitalize_names.php

代码语言:javascript
复制
<?php // RAY_capitalize_names.php
error_reporting(E_ALL);

// SOME TEST NAMES
$names = array
( "o'brien"
, 'MCAFEE'
, "barrett-o'reilly"
, "smith jones"
, "burns"
, "CROWTHER"
, "George w. bush, iiI"
, "RONALD    MCDONALD"
, "RONALD    MCDONALD-o'brien"
, "van De Graaff GeneratoR"
)
;

// TEST EACH CASE
foreach ($names as $name)
{
    echo "<br/>$name ";
    echo fixname($name);
}


// FUNCTION TO HANDLE NAMES
function fixname($name)
{
    // SPECIAL CASES FOR UPPER OR LOWER CASE DISPOSITION
    $uc = array  // UPPERCASE AFTER ANY OF THESE
    ( 'Mc'
    , "'"
    , '-'
    )
    ;

    $lc = array  // ALWAYS LOWER CASE
    ( 'Van De '
    )
    ;

    $mc = array  // ALWAYS UPPER CASE
    ( 'Iii'
    )
    ;

    // REMOVE UNNECESSARY BLANKS
    $name = preg_replace('/\s\s+/', ' ', $name);

    // START WITH LOWER CASE AND UPPER FIRST
    $name = strtolower($name);
    $name = ucwords($name);

    // CHECK FOR KNOWN SPECIAL UPPER-CASES
    foreach ($uc as $dlm)
    {
        // FIX THE Mcdonald EXAMPLE, ETC
        $namex = explode($dlm, $name);
        foreach ($namex as $k => $v)
        {
            $namex[$k] = ucwords($v);
        }
        $name = implode($dlm, $namex);
    }

    // CHECK FOR KNOWN CONSTANT LOWER-CASES
    foreach ($lc as $dlm)
    {
        // FIX THE van de Graaff EXAMPLE
        $name = str_replace($dlm, strtolower($dlm), $name);
    }

    // CHECK FOR KNOW CONSTANT UPPERCASE
    foreach ($mc as $dlm)
    {
        // FIX THE Bush, III EXAMPLE
        $name = str_replace($dlm, strtoupper($dlm), $name);
    }

    // RETURN THE REPAIRED STRING
    return $name;
}
票数 1
EN

Stack Overflow用户

发布于 2012-12-27 04:08:10

把这个解决方案抛到那里..利用数组函数使您的名字出现在您要查找的大小写中。虽然很脏,但是很快很有效。

1)拆分为‘

2)项目array_walk()大写

3)内爆。

4)对空格执行相同的操作

代码语言:javascript
复制
function nameFix(&$name, $key)
{
    $name = ucfirst($name);
}

function nameFixer($name)
{
    $array = explode(" ", $name);
    array_walk(
            $array, 
            function (&$name, $key) { 
                $name = explode("'", $name); 
                array_walk($name, 'nameFix'); 
                $name = implode("'", $name); 
            }
    );
    array_walk($array, nameFix);
    return implode(" ", $array);
}

echo nameFixer("mister port o'hare o'brian fredrickson"); 
// Returns: Mister Port O'Hare O'Brian Fredrickson
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14045450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档