1.5. Expanding and Compressing Tabs
Problem
You want to change spaces to tabs (or tabs to spaces) in a string while keeping text aligned with tab stops. For example, you want to display formatted text to users in a standardized way.
Solution
Use str_replace( )
to switch spaces to tabs or tabs to
spaces:
$r = mysql_query("SELECT message FROM messages WHERE id = 1") or die();
$ob = mysql_fetch_object($r);
$tabbed = str_replace(' ',"\t",$ob->message);
$spaced = str_replace("\t",' ',$ob->message);
print "With Tabs: <pre>$tabbed</pre>";
print "With Spaces: <pre>$spaced</pre>";Using str_replace( ) for conversion, however,
doesn’t respect tab stops. If you want tab stops
every eight characters, a line beginning with a five-letter word and
a tab should have that tab replaced with three spaces, not one. Use
the pc_tab_expand( ) function shown in Example 1-1 to turn tabs to spaces in a way that respects
tab stops.
Example 1-1. pc_tab_expand( )
function pc_tab_expand($a) {
$tab_stop = 8;
while (strstr($a,"\t")) {
$a = preg_replace('/^([^\t]*)(\t+)/e',
"'\\1'.str_repeat(' ',strlen('\\2') *
$tab_stop - strlen('\\1') % $tab_stop)",$a);
}
return $a;
}
$spaced = pc_tab_expand($ob->message);You can use the
pc_tab_unexpand()
function shown in Example 1-2 to turn spaces back to tabs.
Example 1-2. pc_tab_unexpand( )
function pc_tab_unexpand($x) { $tab_stop = 8; $lines = explode("\n",$x); for ($i = 0, $j = count($lines); $i < $j; $i++) { $lines[$i] = pc_tab_expand($lines[$i]); $e = preg_split("/(.\{$tab_stop})/",$lines[$i],-1,PREG_SPLIT_DELIM_CAPTURE); ...