3

探しているものに似た回答が見つかりましたが、私の問題を完全に解決するものではありません。

ユーザーがマイ ページのリンクをクリックすると、Google ブックスに移動して検索が行われます。ただし、本のタイトルの最初の単語に短縮形が含まれていると、すべてが台無しになり、私の修正がうまくいかないようです。

例: 私のページのリンクは次のようになります。

mysite.com/book-search?bookauthor=Lance Armstrong&booktitle=It's Not About the Bike

ただし、これを実行すると:

$bookTitle = $_GET['booktitle']

「It's」のアポストロフィが削除された同じタイトルが表示されます。これだけで、Google ブックス検索が完全に無効になり、結果が返されなくなります。

検索を行う cURL セッションのエンドポイントは次のようになります。

https://www.googleapis.com/books/v1/volumes?q=intitle:' . $bookTitle . '+inauthor:' . $bookAuthor;

自分で試してみてください -

https://www.googleapis.com/books/v1/volumes?q=intitle:It%27s+Not_About+The+Bike+inauthor:ランス+アームストロング

とはまったく異なる結果を返します。

https://www.googleapis.com/books/v1/volumes?q=intitle:Its+Not_About+The+Bike+inauthor:ランス+アームストロング

文字列を urlencode すれば問題は解決すると思うかもしれません。しかし、そうではありません。それでも、私がこれを行うとき、私が理解できない理由で:

$google_endpoint_a = 'https://www.googleapis.com/books/v1/volumes?q=intitle:' . urlencode($bookTitle) . '+inauthor:' . urlencode($bookAuthor);

...GoogleAPI に渡されると urlencoding が取り除かれ、検索結果がゼロになります。

誰かがこれを乗り越えるのを手伝ってくれますか? 考えられることはすべて試しました。

ああ、これがおまけです。これは、文字列の最初の単語にアポストロフィが含まれている場合にのみ発生します。「It's Not About The Bike」​​や「Don't Blink」などの本のタイトルでも同じことが起こります。言い換えれば、アポストロフィは重要ではないようです。(たとえば、作家のビル・オライリーのように。)

アポストロフィが含まれている場合、文字列から最初の単語を削除する簡単な方法はありますか? それとももっと良い方法がありますか?

本当に醜い解決策:

したがって、PHP は urldecode() を介して $_GET 変数を渡します。醜いですが、誰かがより良い方法を考え出すことを願っていますが、問題を解決するために私がやったことは次のとおりです。

URL を介して変数を渡す前に、次のように、アポストロフィを意味不明な文字列に置き換えました。

$booktitle = str_replace("'", "W5x32RS97", $booktitle);

次に、これを実行しました:

$bookTitleTemp = $_GET('booktitle');
$bookTitle = str_replace("W5x32RS97", "'", $bookTitleTemp);

そして突然、すべてが機能します。しかし、もっと良い方法があるはずです。

4

5 に答える 5

1

タイトル文字列の ' by \' を代入しようとしていませんでしたか? つまり、代わりに: It's Not About the Bike を使用して: It\'s Not About the Bike

于 2012-10-10T15:30:05.007 に答える
1

アポストロフィがなければ、intitle:次の文字列を削除してそのまま使用できます。

$google_endpoint_a = 'https://www.googleapis.com/books/v1/volumes?q=' . urlencode($bookTitle) . '+inauthor:' . urlencode($bookAuthor);

https://www.googleapis.com/books/v1/volumes?q=Its+Not_About+The+Bike&inauthor:ランス+アームストロング

アップデート

最初の単語にアポストロフィがある場合に使用する条件を作成するにintitleは、次のようにします。

$pieces = explode(" ", $bookTitle);

if (strpos($pieces[0], "'") !== FALSE) {
    $google_endpoint_a = 'https://www.googleapis.com/books/v1/volumes?q=' . urlencode($bookTitle) . '+inauthor:' . urlencode($bookAuthor);
}
else {
    $google_endpoint_a = 'https://www.googleapis.com/books/v1/volumes?q=intitle:' . urlencode($bookTitle) . '+inauthor:' . urlencode($bookAuthor);
}

以前の変数のエンコードが機能するかどうかも確認します。

$bookTitle = urlencode($_GET[booktitle]);
于 2012-10-10T15:36:35.870 に答える
0

絶望的な病気には絶望的な治療法が必要です。

$translation = array("aint" => "ain't", "arent" => "aren't", "cant" => "can't", "cantve" => "can't've", "cause" => "'cause", "couldve" => "could've", "couldnt" => "couldn't", "couldntve" => "couldn't've", "didnt" => "didn't", "doesnt" => "doesn't", "dont" => "don't", "hadnt" => "hadn't", "hadntve" => "hadn't've", "hasnt" => "hasn't", "havent" => "haven't", "hed" => "he'd", "hedve" => "he'd've", "hell" => "he'll", "hellve" => "he'll've", "hes" => "he's", "hows" => "how's", "Id" => "I'd", "Idve" => "I'd've", "Ill" => "I'll", "Illve" => "I'll've", "Im" => "I'm", "Ive" => "I've", "isnt" => "isn't", "itd" => "it'd", "itdve" => "it'd've", "itll" => "it'll", "itllve" => "it'll've", "its" => "it's", "lets" => "let's", "maam" => "ma'am", "mightve" => "might've", "mightnt" => "mightn't", "mightntve" => "mightn't've", "mustve" => "must've", "mustnt" => "mustn't", "mustntve" => "mustn't've", "oclock" => "o'clock", "oughtnt" => "oughtn't", "oughtntve" => "oughtn't've", "shant" => "shan't", "shantve" => "shan't've", "shed" => "she'd", "shedve" => "she'd've", "shell" => "she'll", "shellve" => "she'll've", "shes" => "she's", "shouldve" => "should've", "shouldnt" => "shouldn't", "shouldntve" => "shouldn't've", "sos" => "so's", "thats" => "that's", "thered" => "there'd", "theres" => "there's", "theyd" => "they'd", "theyll" => "they'll", "theyllve" => "they'll've", "theyre" => "they're", "theyve" => "they've", "wasnt" => "wasn't", "wed" => "we'd", "well" => "we'll", "wellve" => "we'll've", "were" => "we're", "weve" => "we've", "werent" => "weren't", "whatll" => "what'll", "whatllve" => "what'll've", "whatre" => "what're", "whats" => "what's", "whatve" => "what've", "whens" => "when's", "whenve" => "when've", "whered" => "where'd", "wheres" => "where's", "whereve" => "where've", "wholl" => "who'll", "whollve" => "who'll've", "whos" => "who's", "whove" => "who've", "whys" => "why's", "willve" => "will've", "wont" => "won't", "wontve" => "won't've", "wouldve" => "would've", "wouldnt" => "wouldn't", "wouldntve" => "wouldn't've", "yall" => "y'all", "yalldve" => "y'all'd've", "yallre" => "y'all're", "yallve" => "y'all've", "youd" => "you'd", "youdve" => "you'd've", "youll" => "you'll", "youllve" => "you'll've", "youre" => "you're", "youve" => "you've", );

$bookTitle = strtr($bookTitle, $translation);
于 2012-10-10T16:04:35.173 に答える
0

最初の単語のアポストロフィを削除したい場合は、アポストロフィの文字列位置が最初のスペースよりも低いことをテストしてください。その場合は、削除してください。

if(strpos($bookTitle,"'") < strpos($bookTitle," ")){
    $bookTitle = preg_replace('/\'/', '', $bookTitle, 1);
}
于 2012-10-10T15:42:19.800 に答える
0

リンクでは、IT ではなく「It\'s」を使用してください

于 2012-10-10T15:28:37.073 に答える