記得剛開始寫代碼的時候,看到動態輸出ul,table就頭暈;
因爲當時對HTML標籤,製表符,PHP字符串,單引號/雙引號的操作還很不熟練
幾個項目後,再看這些代碼,就有了很親切的感覺
雖然用框架後都直接用封裝好的控件輸出,但是原生態的總是那麼有魅力,讓人細細品味
本文總結2個例子,一個無序列表的動態輸出,一個表格的動態輸出
在後面引用了手冊裏面的字符串部分,尤其是變量解析的細節和字符串操作部分。
目錄:
首先是無序列表 ul
public function build_ul_lists()
{
$initials26= array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
$i=0;
$html.="</br>";
foreach ($initials26 as $key =>$initial)
{
$html.= "\n<ul class=\"inline unstyled initial-button-list\"><button class=btn>".$initial."</button>";
$labels=NULL;
$words = $this->processSearch("","",$initial,1,12);
for($i=0;$i<12;$i++)
{
$link = '<a class="need_model" href="view.php?word_id='.$words[$i]['word_id'].'">'.$words[$i]['word'].'</a>';
//另一種表達方式
$link = "<a class='need_model' href='view.php?word_id=".$words[$i]['word_id']."'>".$words[$i]['word']."</a>";
$word_info = "$link";
$labels.= "\n<li> ".$word_info."</li>";
}
$html.=$labels."</ul>";
}
echo $html;
}
第5行:</br>在頁面上輸出一個換行
第8行:\n 在生成的HTML代碼中 換行,方便閱讀查看
第17行:\n 在生成的HTML代碼中 換行,方便閱讀查看
第17行:  在頁面上輸出一個空格
單引號
定義一個字符串 的最簡單的方法是用單引號把它包圍起來 (標點符號')。
如果想要輸出一個單引號,需在它的前面加個反斜線 (\)。在單引號前或在字符串的結尾處 想要輸出反斜線,輸入兩條 (\\)。注意,如果在任何其它的字符前加了反斜線,反斜線將會被直接輸出。
$link = '<a class="need_model" href="view.php?word_id='.$words[$i]['word_id'].'">'.$words[$i]['word'].'</a>';
在單引號字符串中的變量和特殊含義的字符將不會被替換。
因此,
class="need_model"
直接寫就行;
$words[$i]['word'].'</a>'
PHP變量不能寫在單引號裏面,而是寫出來,並用'.'連接符連接。
雙引號
如果字符串是包圍在雙引號(")中, PHP將對一些特殊的字符進行解析:
Sequence | Meaning |
---|---|
\n | 換行 (LF or 0x0A (10) in ASCII) |
\r | 回車 (CR or 0x0D (13) in ASCII) |
\t | 水平方向的 tab(HT or 0x09 (9) in ASCII) |
\v | 豎直方向的 tab (VT or 0x0B (11) in ASCII) (since PHP 5.2.5) |
\f | 換頁 (FF or 0x0C (12) in ASCII) (since PHP 5.2.5) |
\\ | 反斜線 |
\$ | 美金dollar標記 |
\" | 雙引號 |
\[0-7]{1,3} | 符合該表達式順序的字符串是一個八進制的字符 |
\x[0-9A-Fa-f]{1,2} | 符合該表達式順序的字符串是一個十六進制的字符 |
$html.= "\n<ul class=\"inline unstyled initial-button-list\"><button class=btn>$initial</button>";
用雙引號定義的字符串最重要的特徵是變量會被解析!因此,
<button class=btn>$initial</button>
PHP變量直接寫在HTML裏面就可以
class=\"inline unstyled initial-button-list\"
而要想輸出雙引號本身,則要加 \ (其實這個地方直接用單引號就OK了,HTML標籤的屬性值既可以用單引號包括,也可以用雙引號包括)
對比單引號和雙引號
$link = '<a class="need_model" href="view.php?word_id='.$words[$i]['word_id'].'">'.$words[$i]['word'].'</a>';
$link = "<a class='need_model' href='view.php?word_id=$words[$i]['word_id']'>{$words[$i]['word']}</a>";
當然是用雙引號要簡便,PHP變量直接寫在HTML裏面就可以;但是注意,複雜變量最好用{ }包起來
第二個例子是表格Table
public function searchWordsByPage($keyword,$group,$initial,$page,$perPageNum)
{
$perPageNum=12;//每一頁顯示的條數爲20條
$currentPageFirst=($page-1)*$perPageNum+1;
$currentPageLast=$page*$perPageNum;
$tab_str="";
$tab_str.="<table id='tab_searched' class ='table table-striped table-bordered table-hover table-condensed initial-button-list' align='center'>";
$tab_str.="<thead><td><i class='icon-search'></i></td><td>詞語</td><td>詞語類型</td><td>正負極性</td><td>褒貶值[-3,3]</td><td>詞語類別</td><td>編輯</td></thead>";
//分頁查詢
$words = $this->processSearch($keyword,$group,$initial,$currentPageFirst,$perPageNum);
$i=$currentPageFirst-1;
foreach ( $words as $key => $word )
{
$i++;
$labels=NULL;
$labels.="<tr>";
$labels.="<td width=5%>".$i."</td>";
//詞語
$link = "<a class='need_model' href='view.php?word_id=".$word['word_id']."'>".$word['word']."</a>";
$labels.="<td width='20%'>".$link."</td>";
//詞語類型
$senti_type=($word['senti_type']==1)?"褒貶詞":"程度副詞";
$labels.="<td width='15%'>".$senti_type."</td>";
//正負極性
$senti_jixing=($word['senti_value']>0)?"正面":"負面";
$labels.="<td width='15%'>".$senti_jixing."</td>";
//褒貶值-3~3
$labels.="<td width='15%'>".$word['senti_value']."</td>";
//中英文:1,中文;2,英文
$word_type=($word['word_type']==1)?"中文":"English";
$labels.="<td width='15%'>".$word_type."</td>";
//編輯鏈接
$link2 = "<a class='need_model' href='view.php?word_id=".$word['word_id']."'>編輯</a>";
$labels.="<td width='15%'>".$link2."</td>";
$tab_str.=$labels;
}
$tab_str.="</table>";
return $tab_str;
}
顯示PHP錯誤
有時候,就算有語法錯誤,有可能沒報出來,可以在程序開始之前,加入以下代碼
error_reporting(E_ALL);
關於特殊字符
Sequence | Meaning |
---|---|
\n | 換行 (LF or 0x0A (10) in ASCII) |
\r | 回車 (CR or 0x0D (13) in ASCII) |
\t | 水平方向的 tab(HT or 0x09 (9) in ASCII) |
\v | 豎直方向的 tab (VT or 0x0B (11) in ASCII) (since PHP 5.2.5) |
\f | 換頁 (FF or 0x0C (12) in ASCII) (since PHP 5.2.5) |
\\ | 反斜線 |
\$ | 美金dollar標記 |
\" | 雙引號 |
\[0-7]{1,3} | 符合該表達式順序的字符串是一個八進制的字符 |
\x[0-9A-Fa-f]{1,2} | 符合該表達式順序的字符串是一個十六進制的字符 |
Heredoc結構
第三種定義字符串的方法是用heredoc句法結構:<<<。
在該提示 符後面,要定義個標識符,然後是一個新行。
接下來是字符串 本身,最後要用前面定義的標識符作爲結束標誌。
結束時所引用的標識符必須在一行的開始位置,前面一個空格都不可以有!!!
結束標識符這行除了可能有一個分號(;)外,絕對不能包括 其它字符。
這意味着標識符不能縮進,分號的前後也不能有任何空白或tabs。
標識符的命名也要像其它標籤一樣遵守PHP的規則:只能包含 字母、數字和下劃線,並且不能用數字和下劃線作爲開頭。
Heredoc結構就象是沒有使用雙引號的雙引號字符串
這就是說在heredoc結構中引號不用被替換,但是上文中列出的字符 (\n等)也可使用。
變量將被替換,但在heredoc結構中字符串表達複雜變量時,要格外小 心。
echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
My name is "MyName".
I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital 'A': A
return <<<FORM_MARKUP
<form action="assets/inc/process.inc.php" method="post">
<fieldset>
<legend>$submit</legend>
<label for="word">詞語</label>
<input type="text" name="word" id="word" value="$word->word" />
<label for="senti_type">類型</label>
<input type="text" name="senti_type" id="senti_type" value="$word->senti_type" />
<label for="senti_value">褒貶值</label>
<input type="text" name="senti_value" id="senti_value" value="$word->senti_value" />
<label for="word_type">中英文</label>
<input type="text" name="word_type" id="word_type" value="$word->word_type" />
<input type="hidden" name="word_id" value="$word->word_id" />
<input type="hidden" name="token" value="$_SESSION[token]" />
<input type="hidden" name="action" value="word_edit" />
<p>
<input type="submit" name="word_submit" value="保存" class="btn btn-success"/>
</p>
</fieldset>
</form>
FORM_MARKUP;
Nowdoc結構
就象heredoc結構類似於雙引號字符串,Nowdoc結構是類似於單引號字符串的。
Nowdoc結構很象heredoc結構,但是 nowdoc不進行解析操作 。
這種結構很適合用在不需要進行轉義的PHP代碼和其它大段文本。
一個nowdoc結構也用和heredocs結構一樣的標記 <<<, 但是跟在後面的標誌符要用 單引號括起來,就像<<<'EOT'這樣。
heredocs結構的所有規則也同樣適用於nowdoc結 構,尤其是結束標誌符的規則。
echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
EOT;
以上例程會輸出:
My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should not print a capital 'A': \x41
變量解析
當字符串用雙引號或heredoc結構定義時,其中的變 量將會被解析。簡單的句法規則是最常用和最方便的, 它可以用最少的代碼在一個字符串中加入變量,數組 值,或 對象屬性。
複雜的句法規則是在PHP4以後加入的,被花括號包圍的表達式是其明顯標記。
簡單句法規則
當PHP解析器遇到一個美元符號 ($) , 它會和其它很多解析器一樣,去儘量形成一個合法的變量名。可以用花括 號來明確變量名的界線。
<?php
$beer = 'Heineken';
echo "$beer's taste is great"; //有效;單引號"'"是非法的變量名組成元素
echo "He drank some $beers"; //無效;字母s是有效的變量名組成元素,但是這裏的變量是$beer
echo "He drank some ${beer}s"; // 有效
echo "He drank some {$beer}s"; // 有效
?>
類似的,一個 數組 索引或一個對象 屬性也可被解析。數組索引要用方括號 (]) 來表示邊際, 對象屬性則是和上述的變量規則相同。
<?php
// 下面的例子是在字符串中引用數組
// 當數組處於字符串外部時,要把數組的值用括號括起來且不要用花括號{ }
// 顯示所有錯誤
error_reporting(E_ALL);
$fruits = array('strawberry' => 'red', 'banana' => 'yellow');
// 有效;但是注意在字符串外面不能這樣引用數組
echo "A banana is $fruits[banana].";
// 有效
echo "A banana is {$fruits['banana']}.";
// 有效,但是PHP會先尋找常量banana
echo "A banana is {$fruits[banana]}.";
// 無效,要用花括號,這裏將會產生一個解析錯誤
echo "A banana is $fruits['banana'].";
// 有效
echo "A banana is " . $fruits['banana'] . ".";
// 有效
echo "This square is $square->width meters broad.";
// 無效,解決方法見覆雜結構
echo "This square is $square->width00 centimeters broad.";
?>
如果想要表達更復雜的結構,請用複雜句法規則。
複雜句法規則
複雜句法規則不是結構複雜而命名,而是因爲它可以使用複雜的表達式。
任何想用在字符串中標量變量,數組變量或對象屬性都可使用這種方法。 只需簡單地像在字符串以外的地方那樣寫出表達式, 然後用花括號{和}把它括起來。 由於 { 無法被轉義,只有 $ 要緊挨着 {纔會被認出來,可以用 {\$ 來表達 {$。下面的示例可以更好的解釋:
<?php
// 顯示所有錯誤
error_reporting(E_ALL);
$great = 'fantastic';
// 無效,輸出: This is { fantastic}
echo "This is { $great}";
// 有效,輸出: This is fantastic
echo "This is {$great}";
echo "This is ${great}";
// 有效
echo "This square is {$square->width}00 centimeters broad.";
// 有效
echo "This works: {$arr[4][3]}";
// 這是錯誤的表達式,因爲就象$foo[bar] 的格式不能在字符串以外的地方使用一樣。
// 換句話說,只有在PHP能找到常量foo 的前提下才會正常工作;這裏會產生一個E_NOTICE (undefined constant)級別的錯誤。
echo "This is wrong: {$arr[foo][3]}";
// 有效,當在字符串中使用多重數組時,一定要用括號將它括起來
echo "This works: {$arr['foo'][3]}";
// 有效
echo "This works: " . $arr['foo'][3];
echo "This works too: {$obj->values[3]->name}";
echo "This is the value of the var named $name: {${$name}}";
echo "This is the value of the var named by the return value of getName():
{${getName()}}";
echo "This is the value of the var named by the return value of
\$object->getName(): {${$object->getName()}}";
// 無效,輸出: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>
也可以在字符串中用變量來調用類的屬性。
<?php
class foo {
var $bar = 'I am bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->$baz[1]}\n";
?>
以上例程會輸出:
I am bar.
I am bar.
Note:
函數、行爲、類的靜態變量和類的常量只有在PHP 5以後纔可在 {$} 中使用。然而,只有在用返回的值作爲名 稱的變量存在的情況下才會進行處理,只單一使用花括號 ({}) 無法處理從函數或行爲的返回值或從類的常量或靜態變量的返 回值。
<?php
// 顯示所有錯誤
error_reporting(E_ALL);
class beers {
const softdrink = 'rootbeer';
public static $ale = 'ipa';
}
$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';
// 有效,輸出: I'd like an A & W
echo "I'd like an {${beers::softdrink}}\n";
// 也有效,輸出: I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
?>
字符串操作
存取和修改字符串中的字符
字符串中的字符可以通過一個以0爲開始的,用類似數組結構中的方括號包含對應的數字來查找和修改,比如$str[42], 可以把 字符串想像數組 。
函數 substr() 和substr_replace()可以用來實現多於一個字符 的情況。
有用的函數和操作符
字符串可以用'.' (點) 操作符連接起來, 注意 '+' (加號) 操作符沒有 這個功能。 更多信息參考 字符串操作符 。
對於字符串 的操作有很多有用的函數。
可以參考 字符串函數 瞭解大部分函數, 高級的查找&替換功能可以參考正則表達式函數 或 Perl類型的正則 表達式函數。
另外還有URL字符串的函數, 也有加密/解密字符串的函數。 (mcrypt 和mhash).
最後,可以參考 字符類型函數。
轉換成字符串
一個值可以通過在其前面加上(string)或用strval()函數來轉變成 字符串。
在一個需要字符串的表達式中,字符串會自動轉變
比如在使用函數 echo() 或print() 時, 或在一個變量和一個字符串 進行比較時
就會發生這種轉變 類型 和
類型轉換 可以更好的解釋下面的事情,也可參考函 數 settype() 。
一個booleanTRUE 值被轉換成 字符串"1"。
BooleanFALSE 被轉換成"" (空的字符串)。
這種轉變可以在 boolean 和字符串 之間往返進行。
一個 整數 或 浮點數 被轉變爲數字的字面樣式的字符串 (包括浮點數中的指數部分),使用指數計數法的浮點數 (4.1E+6)也可轉變
數組轉換成 字符串 "Array",因此, echo() 和 print() 無法顯示出該數組的值。
如果顯示一個數組值,可以用 echo $arr['foo']這種結構,更多內容見下文。
在PHP 4中對象被轉換成字符串 "Object", 如果爲了調試原因需要打印出對象的值,方法見正文。
爲了得到對象的類的名稱,可以用 get_class() 函數。
在PHP5中, 可以用 __toString 。
資源總會被轉變成"Resource id #1"這種結構的字符串 , 其中的 1 是PHP分配給該資源的獨特數字。
不用過多關注這種結構,它馬上要轉變了。爲了得到一個 resource類型,可以用函數get_resource_type()。
NULL 總是被轉變成空的字符串。
如上面所說的,直接把數組,對象或 資源 轉換成字符串 不會得到超出其自身的更多信息。
可以使用函數 print_r() 和var_dump() 列出這些類型的內容。
字符串轉變成數字
當一個字符串 被用在了一個數字的環境中,結果和類型如下:
如果字符串 沒有包含 '.','e'或'E' 並且數字值符合整數類型的限定 (PHP_INT_MAX定義的), 這個
字符串 可被認定是一個integer, 在其它情況下被認定爲一個float。
字符串的開始部分給定了它的值,如果字符串 以合法的數字開始,這個數字可直接使用。
否則,值就 是 0 (零)。 合法數值由符號,後面跟着一個或多個數字(可能有個小數點),再跟着可選的指數符號如'e' 或 'E',後面跟着一個或多個數字。
<?php
$foo = 1 + "10.5"; // $foo is float (11.5)
$foo = 1 + "-1.3e3"; // $foo is float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo is integer (1)
$foo = 1 + "bob3"; // $foo is integer (1)
$foo = 1 + "10 Small Pigs"; // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1; // $foo is float (11)
$foo = "10.0 pigs " + 1.0; // $foo is float (11)
?>
更多信息可以參考Unix手冊中的strtod(3)。
本節中的示例可以通過複製/粘貼到下面的代碼中來顯示:
<?php
echo "\$foo==$foo; type is " . gettype ($foo) . "<br />\n";
?>
不要想像在C語言中的那樣,通過一個整數轉換得到相應字符,使用函數 ord() 和chr() 實現ASCII碼和字符間的轉換。
字符串函數
- 預定義常量
- 字符串函數
- addcslashes — 以 C 語言風格使用反斜線轉義字符串中的字符
- addslashes — 使用反斜線引用字符串
- bin2hex — 將二進制數據轉換成十六進制表示
- chop — rtrim 的別名
- chr — 返回指定的字符
- chunk_split — 將字符串分割成小塊
- convert_cyr_string — 將字符由一種 Cyrillic 字符轉換成另一種
- convert_uudecode — 解碼一個 uuencode 編碼的字符串
- convert_uuencode — 使用 uuencode 編碼一個字符串
- count_chars — 返回字符串所用字符的信息
- crc32 — 計算一個字符串的 crc32 多項式
- crypt — 單向字符串散列
- echo — 輸出一個或多個字符串
- explode — 使用一個字符串分割另一個字符串
- fprintf — 將格式化後的字符串寫入到流
- get_html_translation_table — 返回使用 htmlspecialchars 和 htmlentities 後的轉換表
- hebrev — 將邏輯順序希伯來文(logical-Hebrew)轉換爲視覺順序希伯來文(visual-Hebrew)
- hebrevc — 將邏輯順序希伯來文(logical-Hebrew)轉換爲視覺順序希伯來文(visual-Hebrew),並且轉換換行符
- html_entity_decode — Convert all HTML entities to their applicable characters
- htmlentities — Convert all applicable characters to HTML entities
- htmlspecialchars_decode — Convert special HTML entities back to characters
- htmlspecialchars — Convert special characters to HTML entities
- implode — Join array elements with a string
- join — 別名 implode
- lcfirst — Make a string's first character lowercase
- levenshtein — Calculate Levenshtein distance between two strings
- localeconv — Get numeric formatting information
- ltrim — Strip whitespace (or other characters) from the beginning of a string
- md5_file — 計算指定文件的 MD5 散列值
- md5 — 計算字符串的 MD5 散列值
- metaphone — Calculate the metaphone key of a string
- money_format — Formats a number as a currency string
- nl_langinfo — Query language and locale information
- nl2br — 在字符串所有新行之前插入 HTML 換行標記
- number_format — Format a number with grouped thousands
- ord — 返回字符的 ASCII 碼值
- parse_str — Parses the string into variables
- print — 輸出字符串
- printf — 輸出格式化字符串
- quoted_printable_decode — Convert a quoted-printable string to an 8 bit string
- quoted_printable_encode — Convert a 8 bit string to a quoted-printable string
- quotemeta — Quote meta characters
- rtrim — 刪除字符串末端的空白字符(或者其他字符)
- setlocale — Set locale information
- sha1_file — 計算文件的 sha1 散列值
- sha1 — 計算字符串的 sha1 散列值
- similar_text — 計算兩個字符串的相似度
- soundex — Calculate the soundex key of a string
- sprintf — Return a formatted string
- sscanf — Parses input from a string according to a format
- str_getcsv — 解析 CSV 字符串爲一個數組
- str_ireplace — str_replace 的忽略大小寫版本
- str_pad — 使用另一個字符串填充字符串爲指定長度
- str_repeat — 重複一個字符串
- str_replace — 子字符串替換
- str_rot13 — 對字符串執行 ROT13 轉換
- str_shuffle — 隨機打亂一個字符串
- str_split — 將字符串轉換爲數組
- str_word_count — 返回字符串中單詞的使用情況
- strcasecmp — 二進制安全比較字符串(不區分大小寫)
- strchr — 別名 strstr
- strcmp — 二進制安全字符串比較
- strcoll — 基於區域設置的字符串比較
- strcspn — 獲取不匹配遮罩的起始子字符串的長度
- strip_tags — 從字符串中去除 HTML 和 PHP 標記
- stripcslashes — 反引用一個使用 addcslashes 轉義的字符串
- stripos — 查找字符串首次出現的位置(不區分大小寫)
- stripslashes — 反引用一個引用字符串
- stristr — strstr 函數的忽略大小寫版本
- strlen — 獲取字符串長度
- strnatcasecmp — 使用“自然順序”算法比較字符串(不區分大小寫)
- strnatcmp — 使用自然排序算法比較字符串
- strncasecmp — 二進制安全比較字符串開頭的若干個字符(不區分大小寫)
- strncmp — 二進制安全比較字符串開頭的若干個字符
- strpbrk — 在字符串中查找一組字符的任何一個字符
- strpos — 查找字符串首次出現的位置
- strrchr — 查找指定字符在字符串中的最後一次出現
- strrev — 反轉字符串
- strripos — 計算指定字符串在目標字符串中最後一次出現的位置(不區分大小寫)
- strrpos — 計算指定字符串在目標字符串中最後一次出現的位置
- strspn — 計算字符串中全部字符都存在於指定字符集合中的第一段子串的長度。
- strstr — 查找字符串的首次出現
- strtok — 標記分割字符串
- strtolower — 將字符串轉化爲小寫
- strtoupper — 將字符串轉化爲大寫
- strtr — 轉換指定字符
- substr_compare — 二進制安全比較字符串(從偏移位置比較指定長度)
- substr_count — 計算字串出現的次數
- substr_replace — 替換字符串的子串
- substr — 返回字符串的子串
- trim — 去除字符串首尾處的空白字符(或者其他字符)
- ucfirst — 將字符串的首字母轉換爲大寫
- ucwords — 將字符串中每個單詞的首字母轉換爲大寫
- vfprintf — 將格式化字符串寫入流
- vprintf — 輸出格式化字符串
- vsprintf — 返回格式化字符串
- wordwrap — 打斷字符串爲指定數量的字串