PHP 學習總結之字符串

建立

PHP 支持 4 種方式來建立一個字符串:單引號、雙引號、heredoc 語法結構和 nowdoc 語法結構。php

1. 單引號

在單引號字符串中,變量和特殊字符將不會被轉義替換,除了反斜槓和單引號自己:html

echo 'Arnold once said: "I\'ll be back"'; # Arnold once said: "I'll be back"

echo 'You deleted C:\\*.*?'; # You deleted C:\*.*?
2. 雙引號

可以識別字符串中的變量和轉義序列:程序員

$juice = 'apple';
echo "$juice juice."; # apple juice.

echo "Hello \nWorld!";
#Hello
#World!
3. heredoc 語法結構

與雙引號字符串類似。結束標記必須頂頭寫,不能有縮進和空格,且在結束標記末尾要有分號;標記之間的變量能夠被正常解析,可是函數則不能夠。經常使用在輸出包含大量 HTML 文檔的時候。正則表達式

$str = 'heredoc';
$html = <<<END
<div class="container">
    <div class="row">
        <div class="col-xs-4">
            <p>$str</p>
        </div>
    </div>
</div>
END;
echo $html;

#<div class="container">
#    <div class="row">
#        <div class="col-xs-4">
#            <p>heredoc</p>
#        </div>
#    </div>
#</div>
4. nowdoc 語法結構

heredoc 語法結構字符串類似,可是 nowdoc 不進行變量和轉義序列的解析操做。算法

$str = 'nowdoc';
$html = <<<'END'
<div class="container">
    <div class="row">
        <div class="col-xs-4">
            <p>$str</p>
        </div>
    </div>
</div>
END;
echo $str;

#<div class="container">
#    <div class="row">
#        <div class="col-xs-4">
#            <p>$str</p>
#        </div>
#    </div>
#</div>

字符串編碼

在 PHP 字符串中,每一個字符使用一個字節存儲(內存中),這意味着 PHP 只能支持 256 的字符集,所以不支持 Unicode。數據庫

PHP 中的 string 的實現方式是一個由字節組成的數組再加上一個整數指明緩衝區長度。並沒有如何將字節轉換成字符的信息,由程序員來決定。因爲 PHP 並不特別指明字符串的編碼,那字符串究竟是怎樣編碼的呢?答案是字符串會被按照該腳本文件相同的編碼方式來編碼。

通常狀況下,雖然 PHP 內部不支持 Unicode 字符集,可是文件支持 UTF-8 編碼,絕大部分狀況下不會有什麼問題,可是遇到字符串編碼轉換的時候就有問題了,好比在一個 UTF-8 編碼的 PHP 文件中,程序輸出的字符數(6)並不等於實際的字符數(2):數組

echo strlen('中國'); # 6
mbstring 提供了針對 多字節字符串的函數,可以幫你處理 PHP 中的多字節編碼。 除此之外,mbstring 還能在可能的字符編碼之間相互進行編碼轉換。

所以,當須要操做 Unicode 字符集的字符串時候,請務必安裝 mbstring 擴展,並使用相應的函數代替原生的字符串函數:安全

echo mb_strlen('中國', 'UTF-8'); # 2
mbstring 擴展大部分的函數都須要基於一個編碼(內部編碼)來處理,請務必統一使用 UTF-8 編碼,這個大部分能夠在 PHP.INI 中配置。

對於 PHP 字符串編碼問題,強烈建議:app

  1. PHP 腳本文件使用 UTF-8 無 BOM 編碼格式;
  2. 字符串操做使用 mbstring 擴展函數;
  3. 數據庫的鏈接和存儲使用 UTF-8 編碼;
  4. HTML 文檔使用 UTF-8 編碼。

字符串格式化

1. 字符串去除

rtrim() — 刪除字符串末端的空白字符(或者其餘字符)
ltrim() — 刪除字符串開頭的空白字符(或其餘字符)
trim() — 去除字符串首尾處的空白字符(或者其餘字符)函數

$text = "\t\tThese are a few words :) ...  \n";
echo rtrim($text); # "\t\tThese are a few words :) ..."
echo ltrim($text); # "These are a few words :) ...  \n"
echo trim($text);  # "These are a few words :) ..."

$trimmed = trim($hello, "ld"); # "Hello Wor"
2. 格式化字符串以便輸出

nl2br() — 在字符串全部新行以前插入 HTML 換行標記
printf() — 輸出格式化字符串
sprintf() — 把格式化的字符串寫入變量中

echo nl2br("hello \nworld");
#hello 
#world

printf('I need to pay $%.02lf', 1.3568); # I need to pay $1.36

$str = sprintf('I need to pay $%.02lf', 1.3568);
echo $str; # I need to pay $1.36

htmlspecialchars() — 將特殊字符轉換爲 HTML 實體
htmlentities() — 將字符轉換爲 HTML 轉義字符

echo htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES); # &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;

echo htmlentities("A 'quote' is <b>bold</b>"); # A 'quote' is &lt;b&gt;bold&lt;/b&gt
3. 格式化字符串以便存儲

stripslashes() — 反引用一個引用字符串
addslashes() — 使用反斜線引用字符串

$str = "Is your name O\'reilly?";
echo stripslashes($str); # Is your name O'reilly?
echo addslashes($str);   # Is your name O\'reilly?
4. 改變字符串的字母大小寫

strtolower() — 將字符串轉化爲小寫
strtoupper() — 將字符串轉化爲大寫
ucfirst() — 將字符串的首字母轉換爲大寫
ucwords() — 將字符串中每一個單詞的首字母轉換爲大寫

$str = "Mary Had A Little Lamb and She LOVED It So";
echo strtolower($str); # mary had a little lamb and she loved it so
echo strtoupper($str); # MARY HAD A LITTLE LAMB AND SHE LOVED IT SO

$foo = 'hello world!';
$foo = ucfirst($foo); # Hello world!
$foo = ucwords($foo); # Hello World!

字符串鏈接和分割

1. explode()

使用一個字符串分割另外一個字符串:

$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
print_r($pieces); 
# Array ( [0] => piece1 [1] => piece2 [2] => piece3 [3] => piece4 [4] => piece5 [5] => piece6 )
2. implode() 或 join()

將一個一維數組的值拼接爲字符串:

$array = array('lastname', 'email', 'phone');
echo implode(',', $array); # lastname,email,phone
3. substr()

返回字符串的子串:

echo substr('abcdef', 1);     # bcdef
echo substr('abcdef', 1, 3);  # bcd
echo substr('abcdef', -1, 1); # f

字符串比較

1. strcmp()

二進制安全字符串比較(區分大小寫):

echo strcmp('jochen', 'Jochen'); # 32,若是 str1 小於 str2 返回 < 0; 若是 str1 大於 str2 返回 > 0;若是二者相等,返回 0。
2. strcasecmp()

二進制安全比較字符串(不區分大小寫):

echo strcasecmp('jochen', 'Jochen'); # 0
3. strnatcmp()

使用天然排序算法比較字符串:

echo strnatcmp('img12.png', 'img10.png'); # 1,

字符串查找和替換

1. strstr()

查找字符串的首次出現並返回字符串:

echo strstr('name@example.com', '@'); # @example.com
2. strpos()

查找字符串首次出現的位置:

$hello = 'Hello World';
if(strpos($hello, 'H') !== false) {
    echo 'Find';
} else {
    echo 'No Find';
}
3. str_replace()

匹配字符串並替換:

$search = "world";
$replace = "Shanghai";
$subject = "Hello world!";
echo str_replace($search, $replace, $subject); # Hello Shanghai
4. substr_replace()

替換指定位置的字符串:

$replace = "Shanghai";
$subject = "Hello world!";
echo substr_replace($subject, $replace, 6); # Hello Shanghai

正則表達式

1. preg_match()

執行一個正則表達式匹配:

$email = '10001110@qq.com';
$pattern = "/^([a-zA-Z0-9])+([.a-zA-Z0-9_-])*@([.a-zA-Z0-9_-])+([.a-zA-Z0-9_-]+)+([.a-zA-Z0-9_-])$/";

if (preg_match($pattern, $email, $match)) {
    echo '匹配成功<hr />';
} else {
    echo '匹配失敗<hr />';
}
2. preg_match_all()

執行一個全局正則表達式匹配:

$str = "Name: <b>John Poul</b> <br> Title: <b>PHP Guru</b>";
preg_match_all("/<b>(.*)<\/b>/U", $str, $result);
print_r($result);
# Array ( [0] => Array ( [0] => John Poul [1] => PHP Guru ) [1] => Array ( [0] => John Poul [1] => PHP Guru ) )
3. preg_split()

經過一個正則表達式分隔字符串:

$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords);
# Array ( [0] => hypertext [1] => language [2] => programming )
4. preg_replace()

執行一個正則表達式的搜索和替換:

$str = 'foo   o';
echo preg_replace('/\s\s+/', ' ', $str); # 'foo o'

$count = 0;
echo preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count); # xp***to
echo $count; # 3
相關文章
相關標籤/搜索