2015-10-04 130 views
1

我正在開發一個新聞網站,並允許任何文章的作者決定他們想要在文章中添加多少圖片。檢查字符串是否包含多段文字

要包含圖像,他們需要在文章內容的主體內輸入[image1],然後將其轉換爲另一頁上的圖像src。

我正在嘗試編寫一段代碼,檢查用戶輸入的圖像以及相應的標題,然後查看它們是否爲每個圖像應用了[圖像#]和[標題#]標記。

所需的功能:

如果用戶選擇上傳兩張圖片的文章,他們還必須插入兩個字幕。然後,他們必須在文章內容的任何地方陳述[image1] [caption1]和[image2] [caption2]。

如果用戶已將圖像和標題貼到表單中,但未包含正確數量的[圖像#]和[標題#],我正在使用strpos()來提示他們這樣做。然而我正努力實現這一目標。

這是我的代碼到目前爲止,如果任何人都可以告訴我我做錯了什麼,它將不勝感激。

乾杯,豐富

$z = 1; 
while($z < $caption){ 
if (strpos($articleContent,'[caption$z]') == !false) { 
echo 'You have added all of your caption tags in the article.'; 
$z++; 
} else { 
echo "You have not added all of your [caption#] tags in the article content."; 
exit(); 
} 
} 

我再想找簡單ç& p來算[圖像#]標籤相同。

+2

需要使用雙引號。 '$ z'是文字。它也是'!==',而不是'==!'。 http://php.net/manual/en/language.operators.comparison.php另外''caption'是一個整數? – chris85

+0

@ chris85是對的。您可能想要切換if以檢查'!strpos'並在循環之後移動打印成功消息。 – Terminus

+0

不,標題是文字的$ _POST,我糾正了!==,我仍然沒有運氣。 $ z是字面的意思是什麼?如果我循環並添加$ z ++不應該檢查所有內容,直到$ z達到$ caption的數目? –

回答

0

所以試圖解決這個問題一個星期後,我想我會分享最好的答案似乎是缺人試圖做同樣的。

解決方案:

$articleContent = $_POST['articleContent']; 
$imgCount = count($imgTmp1); // Count files array 
$capCount = count($captions); // Count captions array 
$r = 0; 
$c = 0; 

while($r < $imgCount){ 

$i = 1; 
$z = 1; 
$r++; 
$c++; 

$value = "[image$r]"; 
for($check = strpos($articleContent,$value);$i<$imgCount;$i++){ 
} 
if($check !== false){ 
// Your success, if any 
} else { 
echo "<span class='error'>You need to include '$value' into the article content.</span>"; 
exit(); 
} 

$value2 = "[caption$c]"; 
for($check2 = strpos($articleContent,$value2);$z<$capCount;$z++){ 
} 

if($check2 !== false){ 
// Your success, if any 
} else { 
echo "<span class='error'>You need to include '$value2' into the article content.</span>"; 
exit(); 
} 
} 

這個問題不是與變量本身,因爲他們在每個循環正確呼應了我試圖用隨取。問題實際上是strpos。正如你所看到的,我已經將strpos插入到循環中,它就像桃子一樣工作。

祝好運給任何人,與我在這裏遇到的同樣問題奮鬥,感謝所有人的幫助。

2

嘗試preg_match_all()

如果它的預期始終是一個連續的字符串(如[圖像1] [caption1]),你可以嘗試這樣的:

<?php 

$articleContent = 'The M-209 is a portable, mechanical cipher machine. 
[image1][caption1] In this photograph, an intermediate gear unit meshes 
with gears adjoining each key wheel. 
[image2][caption2]Visible to the left of the image is the typewheel 
that prints out messages and ciphertext onto paper tape.'; 

// Is something out of place or any captions missing? 
preg_match_all('~(\[image([\d])+\](?!\s*\[caption\\2\]))~i', $articleContent, $matches); 

empty($matches[0]) or die('Please add proper caption to: ' . implode(', ', $matches[0]). '.'); 

?> 

如果有應該是一堆的兩個相應的標籤之間的東西,(如[圖像1]嗒嗒123耶[caption1])使用這個表達式來代替:

<?php 

preg_match_all('~(\[image([\d]+)\](?!.*\[caption\\2\]))~i', $articleContent, $matches); 

?> 

而這裏的沒有丟失的字幕數報告不同的方法......

<?php 

$articleContent = 'The M-209 is a portable, mechanical cipher 
machine used primarily by the US military in World War II, though 
it remained in active use through the Korean War. 
[image1][caption1] In this photograph, an intermediate gear unit 
meshes with gears adjoining each key wheel. 
[image2][caption2] Visible to the left of the image is the typewheel 
that prints out messages and ciphertext onto paper tape.'; 

preg_match_all('~(\[image[0-9]+\])~i', $articleContent, $images_array); 

if(!empty($images_array[0])) { 

    preg_match_all('~(\[caption[0-9]+\])~i', $articleContent, $captions_array); 

    if(count(array_unique($images_array[0])) > count(array_unique($captions_array[0]))) { 

     echo 'You have not added all of your [caption#] tags in the article content.'; 
     exit; 


    } else { 

     echo 'You have added all of your caption tags in the article.'; 

    } 

} 

?> 
+0

不錯。這可以處理他們不匹配的標題和圖像#? (真的是更多的OP練習) – Terminus

+0

有了更多的檢查,它肯定可以。 – BornKillaz

2

這可能是矯枉過正,但希望它給你一些有用的東西。

<?php 

$article_content = "abc[image1]def[image2]ghi[image5]jkl[image123]mno" . 
    "[imagex]pqr[image3stu[image10]vwximage4]yza[caption3]bcd[caption1]" . 
    "efg[caption2]hij[caption5]klm[caption123]nop[caption10]qrs[image100]"; 


function find_tags($content, $tag_name) { 
    $tag_length = strlen($tag_name); 
    $ids = []; 
    $position = 0; 
    while(($position = strpos($content, "[" . $tag_name, $position)) !== false) { 
     $end_position = strpos($content, "]", $position); 
     if(is_numeric($id = substr($content, $position + $tag_length + 1, $end_position - $position - $tag_length - 1))) { 
      $ids[] = $id; 
     } 
     $position++; 
    } 
    return $ids; 
} 

function match_ids($tag_ids) { 

    $tag_names = array_keys($tag_ids); 

    sort($tag_ids[$tag_names[0]]); 
    sort($tag_ids[$tag_names[1]]); 

    $missing_ids_in_0 = array_diff(
     $tag_ids[$tag_names[1]], 
     $tag_ids[$tag_names[0]] 
    ); 
    $missing_ids_in_1 = array_diff(
     $tag_ids[$tag_names[0]], 
     $tag_ids[$tag_names[1]] 
    ); 
    return array(
     $tag_names[0] . "_missing" => $missing_ids_in_0, 
     $tag_names[1] . "_missing" => $missing_ids_in_1 
    ); 
} 

$tag_ids = array(
    "image" => find_tags($article_content, "image"), 
    "caption" => find_tags($article_content, "caption") 
); 
var_dump($tag_ids); 

$match_result = match_ids($tag_ids); 
var_dump($match_result); 
echo "<br>"; 

if(sizeof($match_result["image_missing"])) { 
    foreach($match_result["image_missing"] as $id) { 
     echo "Please add an [image" . $id . "] tag.<br>"; 
    } 
} 
if(sizeof($match_result["caption_missing"])) { 
    foreach($match_result["caption_missing"] as $id) { 
     echo "Please add a [caption" . $id . "] tag.<br>"; 
    } 
} 

?> 

輸出:

array (size=2) 
    'image' => 
    array (size=6) 
     0 => string '1' (length=1) 
     1 => string '2' (length=1) 
     2 => string '5' (length=1) 
     3 => string '123' (length=3) 
     4 => string '10' (length=2) 
     5 => string '100' (length=3) 
    'caption' => 
    array (size=6) 
     0 => string '3' (length=1) 
     1 => string '1' (length=1) 
     2 => string '2' (length=1) 
     3 => string '5' (length=1) 
     4 => string '123' (length=3) 
     5 => string '10' (length=2) 
array (size=2) 
    'image_missing' => 
    array (size=1) 
     2 => string '3' (length=1) 
    'caption_missing' => 
    array (size=1) 
     4 => string '100' (length=3) 

Please add an [image3] tag. 
Please add a [caption100] tag. 
+0

這很漂亮。如果你使用@bornkillaz'preg_match_all'稍微修改'preg_match_all('〜\ ['。$ tag_name。'([0-9] +)\]〜i',$ content,$ ids);''你可以'返回$ ids [1];'在'find_tags'中。另外,我很確定'排序'是沒有必要的。 +1 – Terminus

+0

當我今天晚些時候到達電腦時,我將通讀所有答案。多謝你們。 –

+0

這確實有效,但它與[圖片]標籤中[標題]標籤的數量相匹配。其功能是當用戶插入文件上傳字段時,他們必須輸入[image1]和[caption1]。如果他們完全忘記輸入它們,那麼如果劇本從未退出,劇本將不知道將標題圖像放在哪裏。無論如何,我已經給你+1了,謝謝。 –

相關問題