2013-06-27 91 views
0

我有這個小問題,我總是beginer,我需要幫助,如何分割字符串與PHP。我有這個代碼,只有在字符串中有一個分隔符時才能正常工作,但我需要完全控制什麼是分隔的以及如何分隔。這是來自yootheme warp modules.php的小修改代碼。我在字符串「||」或「#|」或「|#」中有3個分隔符,它們可能是字符串或不是。 $title是來自joomla模塊標題名稱的$module->title。我們的絃樂。 $split_color$subtitle我控制模塊的不同樣式的開/關。PHP與PHP多重分隔字符串

$title   = $module->title; 
$split_color = 1; 
$subtitle  = 1; 
// split title in two colors 
if ($split_color) { 
    $pos = mb_strpos($title, '#|'); 
    if ($pos !== false) { 
     $title = '<span class="color">'.mb_substr($title, 0, $pos).'</span>'.'<span class="no-color">'.mb_substr($title, $pos + 2).'</span>'; 
    } 
} 

if ($split_color) { 
    $pos = mb_strpos($title, '|#'); 
    if ($pos !== false) { 
     $title = '<span class="no-color">'.mb_substr($title, 0, $pos).'</span>'.'<span class="color">'.mb_substr($title, $pos + 2).'</span>'; 
    } 
} 

// create subtitle 
if ($subtitle) { 
    $pos = mb_strpos($title, '||'); 
    if ($pos !== false) { 
     $title = '<span class="title">'.mb_substr($title, 0, $pos).'</span>'.'<span class="subtitle">'.mb_substr($title, $pos + 2).'</span>'; 
    } 
} 

字符串是簡單的純文本名稱可以有隔板劃分,例如:

Text 1 |# Text 2 || Text 3 #| Text 4

,我的問題是如何做到這一點的工作都在一起。

'||' - 將字符串分成兩部分,左側部分必須在<span class="title"></span>,右側部分必須在<span class="title"></span>。例如:

字符串1:Text 1 Text 2 || Text 3 Text 4

結果1:

<span class="title">Text 1 Text 2</span> 
<span class="subtitle">Text3 Text4</span> 

'#|' - 上兩個部分劃分字符串,左部分被放置到<span class="color"></span>和右部分之間在給<span class="no-color"></span>。例如:

字符串2:Text 1 Text 2 #| Text 3 Text 4

結果2:

<span class="color">Text 1 Text 2</span> 
<span class="no-color">Text3 Text4</span> 

'|#' - 上兩個部分劃分字符串,左部分被放置到<span class="no-color"></span>和右部分之間在給<span class="color"></span>。例如:

字符串2:Text 1 Text 2 |# Text 3 Text 4

結果2:

<span class="no-color">Text 1 Text 2</span> 
<span class="color">Text3 Text4</span> 

但是可以使用在一個時間所有分離器。

字符串3:Text 1 #|Text 2 || Text 3 |# Text 4

結果3:

<span class="title">  
    <span class="color">Text 1</span> 
    <span class="no-color">Text2</span> 
</span> 
<span class="subtitle"> 
    <span class="no-color">Text 3</span> 
    <span class="color">Text4</span> 
</span> 

所有可能的字符串例子:

字符串一個:Text 1 Text 2 Text 3 Text 4

串B:Text 1 Text 2 || Text 3 Text 4

串c: Text 1 Text 2 #| Text 3 Text 4

字符串d:Text 1 Text 2 |# Text 3 Text 4

串E:Text 1 #|Text 2 || Text 3 Text 4

字符串F:Text 1 Text 2 || Text 3 |# Text 4

字符串克:Text 1 |#Text 2 || Text 3 Text 4

字符串H:Text 1 Text 2 || Text 3 #| Text 4

字符串I:Text 1 #| Text 2 || Text 3 #| Text 4

字符串記者:Text 1 |# Text 2 || Text 3 |# Text 4

字符串K:Text 1 #| Text 2 || Text 3 |# Text 4

字符串L:Text 1 |# Text 2 || Text 3 #| Text 4

還有一兩件事,當我寫我的發生,我不能用兩個 '#|' 或 '#|'在字符串中沒有'||'的分隔符,或者不會更好地使用語言的'|#'和'#|'來控制這個分隔符在<span class="color"></span>之間和外面是什麼n <span class="no-color"></span>。像這樣的東西。

字符串:|#Text 1 #| Text |# 2 #| || Text 3 |# Text 4 #| 結果:

<span class="title">  
    <span class="color">Text 1</span> 
    <span class="no-color">Text</span> 
    <span class="color">2</span> 
</span> 
<span class="subtitle"> 
    <span class="no-color">Text 3</span> 
    <span class="color">Text4</span> 
</span> 

我認爲這將是更好的,但是有一件事是你想怎麼做,第二件事是在PHP怎麼寫。謝謝大家誰想要幫助我。非常感謝。

回答

0

如果我理解正確的話,那麼這應該工作:

$parts = explode(' || ', $title); 

//title ... 
$output = '<span class="title">'; 
$pos = mb_strpos($parts[0], '#|'); 
if($pos !== false){ 
    $output .= '<span class="color">'.mb_substr($parts[0], 0, $pos).'</span><span class="no-color">'.mb_substr($parts[0], $pos + 2).'</span>'; 
} else { 
    $output .= $parts[0]; 
} 
$output .= "</span>\n"; 

if(isset($parts[1])){ 
    //subtitle ... 
    $output .= '<span class="subtitle">'; 
    $pos  = mb_strpos($parts[1], '|#'); 
    if ($pos !== false) { 
     $output .= '<span class="no-color">'.mb_substr($parts[1], 0, $pos).'</span><span class="color">'.mb_substr($parts[1], $pos + 2).'</span>'; 
    } else { 
     $output .= $parts[1]; 
    } 
    $output .= "</span>\n"; 
} 

echo $output; 
0

沒有測試過,但是這給了一槍:

function get_inner_spans($content) { 
    #this function will handle "title" content or "subtitle" content 

    #determine if we need to split this content string - we may not need to 
    if (mb_strpos($content, '#|')) { 
     $delimeter = '#|'; 
    } elseif (mb_strpos($content, '|#')) { 
     $delimiter = '|#'; 
    } 

    if (isset($delimiter)) { 
     list($color, $no_color) = explode($delimiter, $content); 

     $inner_html = '<span class="color">' . $color . '</span>'; 
     $inner_html .= '<span class="no-color">' . $no_color . '</span>'; 
    } else { 
     #no need to split this string, so just return the original string passed 
     $inner_html = $content; 
    } 

    return $inner_html; 
} 

#i'm assuming this string will always contain '||' 
$input = 'Text 1 Text 2 Text 3 #| Text 4 || Text 5 |# Text 6'; 

list($title_content, $subtitle_content) = explode('||', $input); 

$output_html = '<span class="title">' 
      . get_inner_spans($title_content) 
      . '</span>' 
      . '<span class="subtitle">' 
      . get_inner_spans($subtitle_content) 
      . '</span>'; 

echo $output_html; 

這是我的理解是標題和字符串的小標題部分可以包含或者#||#。我寫的get_spans函數會匹配任何一個函數。希望其餘的邏輯很清楚。

我發現它有助於爲變量提供非常清晰的名稱,以準確描述它們包含的內容。讓事情變得簡單。