diff --git a/lib/inlines.js b/lib/inlines.js
index 1f0cbb7c..a37d1665 100644
--- a/lib/inlines.js
+++ b/lib/inlines.js
@@ -980,17 +980,38 @@ var parseInline = function(block) {
 // Parse string content in block into inline children,
 // using refmap to resolve references.
 var parseInlines = function(block) {
-    // trim() removes non-ASCII whitespaces, vertical tab, form feed and so on.
+    // String.protoype.trim() removes non-ASCII whitespaces, vertical tab, form feed and so on.
     // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#return_value
     // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#white_space
     // Removes only ASCII tab and space.
-    this.subject = block._string_content.replace(/^[\t \r\n]+|[\t \r\n]+$/g, "")
+    this.subject = trim(block._string_content)
     this.pos = 0;
     this.delimiters = null;
     this.brackets = null;
     while (this.parseInline(block)) {}
     block._string_content = null; // allow raw string to be garbage collected
     this.processEmphasis(null);
+
+    function trim(str) {
+        var start = 0;
+        for(; start < str.length; start++) {
+            if (!isSpace(str.charCodeAt(start))) {
+                break;
+            }
+        }
+        var end = str.length - 1;
+        for(; end >= start; end--) {
+            if (!isSpace(str.charCodeAt(end))) {
+                break;
+            }
+        }
+        return str.slice(start, end + 1);
+
+        function isSpace(c) {
+            // U+0020 = space, U+0009 = tab, U+000A = LF, U+000D = CR
+            return c === 0x20 || c === 9 || c === 0xa || c === 0xd;
+        }
+    }
 };
 
 // The InlineParser object.